如何解析动态字符串?

时间:2014-05-14 13:22:49

标签: sql-server sql-server-2008 tsql

如何解析动态字符串以提取数据?下面的示例:(用于SQL Server 2008 R2的T-SQL编写)

要解析的日期:

BUSINESS=12^REFERENCE=9255^ACCOUNT_TYPE=SUPPLIER^SHIPPING_ID=ACHP^

我需要REFERENCE时的ACCOUNT_TYPE=SUPPLIER号码。

参考编号的长度可以是1到16个字符。

我的SQL语句看起来像这样:

SELECT <REFERENCE NUMBER> FROM ACCOUNTS

结果看起来像这样:

9255
84
1
151221
415
99
etc...

2 个答案:

答案 0 :(得分:4)

您应该规范化您的数据。但这是一个解决方案。

declare @accounts table(col1 varchar(max))

insert @accounts values('BUSINESS=12^REFERENCE=9255^ACCOUNT_TYPE=SUPPLIER^SHIPPING_ID=ACHP^')

SELECT replace(data, 'REFERENCE=', '') FROM
(
SELECT t.c.value('.', 'VARCHAR(2000)') data
FROM (
    SELECT x = CAST('<t>' + 
        REPLACE(col1, '^', '</t><t>') + '</t>' AS XML)
    FROM @accounts
    WHERE col1 like '%ACCOUNT_TYPE=SUPPLIER%'
) a
CROSS APPLY x.nodes('/t') t(c)
) x
WHERE data like 'REFERENCE=%'

结果:

9255

修复您的数据,这将使您免于悲伤

答案 1 :(得分:0)

这将为您提供包含您给出的示例的每一行所需的数字:

DECLARE @text VARCHAR(50)

SET @text = 'BUSINESS=12^REFERENCE=9255^ACCOUNT_TYPE=SUPPLIER^SHIPPING_ID=ACHP^'

SELECT SUBSTRING(@text,CHARINDEX('^REFERENCE',@text)+11,
                 (CHARINDEX('^ACCOUNT_TYPE',@text)) 
                 - (CHARINDEX('^REFERENCE',@text)+11))

只需将@text替换为字段名称,您就可以了!