根据模式

时间:2017-05-27 14:17:47

标签: sql sql-server tsql

我的列中包含{" 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的方法。

2 个答案:

答案 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)

<强>返回

enter image description here

答案 1 :(得分:2)

为什么不能只查找关键字?

SELECT PATINDEX('%"ApplicationID":%', '{"Type":1,"ApplicationID":177,}') 

我认为不需要匹配值,只需要匹配关键字,特别是考虑到关键字已经是双引号。

另外,我应该指出,为了匹配具有该关键字的值,请使用LIKE

WHERE col LIKE '%"ApplicationID":%'