我的列中包含{" Type":1," ApplicationID":1,}或
等数据{"Type":1,"ApplicationID":158,}
or
{"Type":1,"ApplicationID":234,"TarifType":1,"TarifID":2} or etc.
我试过
SELECT PATINDEX('%"ApplicationID":___,%', '{"Type":1,"ApplicationID":177,}')
or
SELECT PATINDEX('%"ApplicationID":[0-9][0-9][0-9],%', '{"Type":1,"ApplicationID":177,}')
获取表达式索引,返回一个值。
但问题是应用程序ID可以是从1到int(max)的任何数字,因此我们无法修复上述查询中的整数字符数。
如果我能找到正确的路径索引,我可能会在以后找到子字符串。
有没有办法做到这一点?我需要在子查询或与cor相关的查询中使用应用程序ID。否则我们可以将它存储在某个临时表中。
请建议一种获取此ID的方法。
答案 0 :(得分:3)
如果不 2016
只是为了好玩,或许有点过分,你可以将你的JSON字符串转换为XML,然后取代所需的值/属性。
我添加了一个额外的replace(JSON_String,',}','}')
来捕获格式错误的JSON字符串。如果样本数据是拼写错误,则可以删除。
示例强>
Declare @YourTable table (ID int,JSON_String varchar(max))
Insert Into @YourTable values
(1,'{"Type":1,"ApplicationID":1,}')
,(2,'{"Type":1,"ApplicationID":158,}')
,(3,'{"Type":1,"ApplicationID":234,"TarifType":1,"TarifID":2}')
Select A.ID
,[Type] = XMLData.value('(row/@Type)[1]' , 'int')
,[ApplicationID] = XMLData.value('(row/@ApplicationID)[1]', 'int')
,[TarifID] = XMLData.value('(row/@TarifID)[1]' , 'int')
From @YourTable A
Cross Apply (values (convert(xml,replace(replace(replace(replace(replace(replace(JSON_String,',}','}'),'"',''),'{','<row '),'}','"/>'),':','="'),',','" ')))
) B (XMLData)
<强>返回强>
答案 1 :(得分:2)
为什么不能只查找关键字?
SELECT PATINDEX('%"ApplicationID":%', '{"Type":1,"ApplicationID":177,}')
我认为不需要匹配值,只需要匹配关键字,特别是考虑到关键字已经是双引号。
另外,我应该指出,为了匹配具有该关键字的值,请使用LIKE
:
WHERE col LIKE '%"ApplicationID":%'