当前位置: 首页 > 面试题库 >

解析字符串SQL

胡星汉
2023-03-14
问题内容

我在MSSQL中有一个很长的字符串,我需要I值。

I代表发票,A代表金额,D代表日期

I = 940; A = 29.5; D = 20090901 | I = 941; A = 62.54; D = 20090910 | I =
942; A = 58.99; D = 20091005 | I = 954; A = 93.45; D = 20091201 | I = 944; A
= 96.76; D = 20091101 | I = 946; A = 52.5; D = 20091101 | I = 943; A =
28.32; D = 20091101 | I = 945; A = 52.5; D = 20091101 | I = 955; A = 79.81;
D = 20091201 | I = 950; A = 25.2; D = 20091124 | I = 948; A = 31.86; D =
20091110 | I = 949; A = 28.32; D = 20091120 | I = 947; A = 25.2; D =
20091109 | I = 951; A = 242.54; D = 20091124 | I = 952; A = 28.32; D =
20091129 | I = 956; A = 38.94; D = 20091210 | I = 957; A = 107.39; D =
20091215 | I = 958; A = 32.55; D = 20091228 | I = 959; A = 27.3; D =
20091228 | I = 960; A = 24.79; D = 20091230 | I = 1117; A = 28.32; D =
20100131 | I = 1115; A = 272.58; D = 20100131 | I = 1116; A = 159.6; D =
20100209

这是最可怕的情况之一。

这些都是发票编号,它们具有相关的值,我将使用这些值链接到另一笔交易。如果有人可以解释最好的方式而不做任何应用,我将不胜感激


问题答案:
declare @s varchar(max) = 'I=940;A=29.5;D=20090901|I=941;A=62.54;D=20090910|I=942;A=58.99;D=20091005|I=954;A=93.45;D=20091201|I=944;A=96.76;D=20091101|I=946;A=52.5;D=20091101|I=943;A=28.32;D=20091101|I=945;A=52.5;D=20091101|I=955;A=79.81;D=20091201|I=950;A=25.2;D=20091124|I=948;A=31.86;D=20091110|I=949;A=28.32;D=20091120|I=947;A=25.2;D=20091109|I=951;A=242.54;D=20091124|I=952;A=28.32;D=20091129|I=956;A=38.94;D=20091210|I=957;A=107.39;D=20091215|I=958;A=32.55;D=20091228|I=959;A=27.3;D=20091228|I=960;A=24.79;D=20091230|I=1117;A=28.32;D=20100131|I=1115;A=272.58;D=20100131|I=1116;A=159.6;D=20100209'
declare @xml xml

select @xml = '<item><value>'+replace(replace(@s, ';','</value><value>'), '|','</value></item><item><value>')+'</value></item>'

select N.value('substring(value[1],3)', 'int') as Invoice,
       N.value('substring(value[2],3)', 'money') as Amount,
       N.value('substring(value[3],3)', 'date') as [Date]
from @xml.nodes('item') as T(N)

结果:

Invoice     Amount                Date
----------- --------------------- ----------
940         29,50                 2009-09-01
941         62,54                 2009-09-10
942         58,99                 2009-10-05
954         93,45                 2009-12-01
944         96,76                 2009-11-01
946         52,50                 2009-11-01
943         28,32                 2009-11-01
945         52,50                 2009-11-01
955         79,81                 2009-12-01
950         25,20                 2009-11-24
948         31,86                 2009-11-10
949         28,32                 2009-11-20
947         25,20                 2009-11-09
951         242,54                2009-11-24
952         28,32                 2009-11-29
956         38,94                 2009-12-10
957         107,39                2009-12-15
958         32,55                 2009-12-28
959         27,30                 2009-12-28
960         24,79                 2009-12-30
1117        28,32                 2010-01-31
1115        272,58                2010-01-31
1116        159,60                2010-02-09

对于SQL Server 2005,您需要使用datetime而不是date

select N.value('substring(value[1],3)', 'int') as Invoice,
       N.value('substring(value[2],3)', 'money') as Amount,
       N.value('substring(value[3],3)', 'datetime') as [Date]
from @xml.nodes('item') as T(N)

要从表中读取,您需要这样做。

declare @s varchar(max) = 'I=940;A=29.5;D=20090901|I=941;A=62.54;D=20090910|I=942;A=58.99;D=20091005|I=954;A=93.45;D=20091201|I=944;A=96.76;D=20091101|I=946;A=52.5;D=20091101|I=943;A=28.32;D=20091101|I=945;A=52.5;D=20091101|I=955;A=79.81;D=20091201|I=950;A=25.2;D=20091124|I=948;A=31.86;D=20091110|I=949;A=28.32;D=20091120|I=947;A=25.2;D=20091109|I=951;A=242.54;D=20091124|I=952;A=28.32;D=20091129|I=956;A=38.94;D=20091210|I=957;A=107.39;D=20091215|I=958;A=32.55;D=20091228|I=959;A=27.3;D=20091228|I=960;A=24.79;D=20091230|I=1117;A=28.32;D=20100131|I=1115;A=272.58;D=20100131|I=1116;A=159.6;D=20100209'

declare @YourTable table(ID int, s varchar(max))
insert into @YourTable values
(1, @s),
(2, @s)

select Y.ID,
       T.N.value('substring(value[1],3)', 'int') as Invoice,
       T.N.value('substring(value[2],3)', 'money') as Amount,
       T.N.value('substring(value[3],3)', 'date') as [Date]
from @YourTable as Y
  cross apply (select cast('<item><value>'+replace(replace(Y.s, ';','</value><value>'), '|','</value></item><item><value>')+'</value></item>' as xml)) as X(XMLCol)
  cross apply X.XMLCol.nodes('item') as T(N)


 类似资料:
  • 问题内容: 将sql字符串解析成单独的组件的好方法是什么。我尝试过使用正则表达式,但是无法使其正常工作。 例如说: 将创建一个包含所有组件的数组 等等… 谢谢 问题答案: 我会选择一个可以与您的语言集成的sql解析器:不要重新发明轮子。 我没有特别推荐一个人,但是我敢肯定,您会找到一个可以满足您需求的人。 参见相关文章:PHP MySQL SQL解析器(INSERT和UPDATE)

  • Milo Yip 2016/9/27 本文是《从零开始的 JSON 库教程》的第三个单元解答编。解答代码位于 json-tutorial/tutorial03_answer。 1. 访问的单元测试 在编写单元测试时,我们故意先把值设为字符串,那么做可以测试设置其他类型时,有没有调用 lept_free() 去释放内存。 static void test_access_boolean() {

  • 问题内容: 我有以下Json字符串 我正在尝试解析它并打印出每个名称和值-最简单的方法是什么?我尝试了jQuery.parseJSON但我不知道如何使用它 示例代码会很棒 问题答案: 结果是: jsFiddle示例:http://jsfiddle.net/bradchristie/XtzjZ/1/

  • 主要内容:Jsoup 解析字符串 语法,Jsoup 解析字符串 说明,Jsoup 解析字符串 示例以下示例将展示将 HTML 字符串解析为 Document 对象。 Jsoup 解析字符串 语法 document : 文档对象代表 HTML DOM。 Jsoup : 解析给定 HTML 字符串的主类。 html : HTML 字符串。 Jsoup 解析字符串 说明 parse(String html) 方法将输入的 HTML 解析为一个新的 Document。该文档对象可用于遍历和获取 htm

  • Milo Yip 2016/9/22 本文是《从零开始的 JSON 库教程》的第三个单元。本单元的练习源代码位于 json-tutorial/tutorial03。 本单元内容: JSON 字符串语法 字符串表示 内存管理 缓冲区与堆栈 解析字符串 总结和练习 参考 常见问题 1. JSON 字符串语法 JSON 的字符串语法和 C 语言很相似,都是以双引号把字符括起来,如 "Hello"。但字符

  • 从一个字符串中获取子字符串(片段),每次一个。 Loop, Parse, InputVar [, Delimiters, OmitChars] 参数 Parse 此参数必须为单词 PARSE, 且与其他类型的循环不同, 它不能为包含单词 PARSE 的变量引用. InputVar 需要被分解的变量名称. 不要把名称括在百分号中, 除非您希望使用变量的 内容 作为被解析的变量名. 分隔符 如果此参数