SQL 提取给定字符串的两个逗号之间的字符串,并拆分为两列的键值对

SATISD9X

我在一个字段中连接了以下值(我已经拆分了它们)

--,\r\n  \"Indie_163\": \"\",
--,\r\n  \"Pop_197\": null,
--,\r\n  \"Mgr_206\": \"Mark Timberland\",
--,\r\n  \"Date_225\": \"02/28/2019\"
--,\r\n  \"Fees_200\": \"57500\",

字段中的实际值:

 {\"Indie_163\": \"\","Pop_197\": null,\r\n  \"Mgr_206\": \"Mark Timberland\",\r\n  \"Date_225\": \"02/28/2019\",\r\n  \"Fees_200\": \"57500\"})

需要将它们拆分为 5 个密钥对值列:

Indie_Key | Indie_Val | Pop_Key | Pop_Val | Mgr_Key | Mgr_Val | Date_Key | Date_Val | Fees_Key | Fees_Val

它应该将 Keys 和 value 填充为 (Blank '', null, or values come after split (:) 在双引号内)

注意:列 - 'Indie_'、'Pop_'、'Mgr_'、'Date_'、'Fees_' 是固定字符串,后缀数字可以更改

西里尔·杜兰德

您的数据看起来像编码错误的 json 值。您可以使用以下方法修复这些问题replace(replace(x, '\"', '"'), '\r\n', '')

OPENJSONT-SQL函数让你查询JSON值。MSDN上提供了更多信息

让我们拥有这些数据:

DECLARE @data TABLE (ID int, x nvarchar(max))
INSERT INTO @data
VALUES
    (1, ' {\"Indie_163\": \"A\","Pop_197\": null,\r\n  \"Mgr_206\": \"Mark Timberland\",\r\n  \"Date_225\": \"02/28/2019\",\r\n  \"Fees_200\": \"57500\"})'),
    (2, ' {\"Indie_163\": \"B\","Pop_197\": null,\r\n  \"Mgr_206\": \"Mark X\",\r\n  \"Date_225\": \"02/28/2017\",\r\n  \"Fees_200\": \"57501\"})'),
    (3, ' {\"Indie_164\": \"C\","Pop_197\": \"D\",\r\n  \"Mgr_206\": \"Mark Y\",\r\n  \"Date_225\": \"02/28/2018\",\r\n  \"Fees_200\": \"57502\"})')

在此处输入图片说明

您可以使用查询它们

SELECT * 
FROM @data
    CROSS APPLY openjson(replace(replace(x, '\"', '"'), '\r\n', '')) x 

哪个会产生这个

在此处输入图片说明

然后你可以像这样查询你想要的每个字段:

SELECT id, 
    MAX(Pop_KEY)    POP_KEY,    MAX(Pop_VALUE)      Pop_VALUE,
    MAX(Indie_KEY)  Indie_KEY,  MAX(Indie_VALUE)    Indie_VALUE,
    MAX(Date_KEY)   Date_KEY,   MAX(Date_VALUE)     Date_VALUE,
    MAX(Fees_KEY)   Fees_KEY,   MAX(Fees_VALUE)     Fees_VALUE
FROM (
    SELECT id, 
        IIF(charindex('Pop',   [key]) = 1, [key],null) as Pop_KEY,   IIF( charindex('Pop',   [key]) = 1, [value],null) as Pop_VALUE,
        IIF(charindex('Indie', [key]) = 1, [key],null) as Indie_KEY, IIF( charindex('Indie', [key]) = 1, [value],null) as Indie_VALUE,
        IIF(charindex('Date',  [key]) = 1, [key],null) as Date_KEY,  IIF( charindex('Date',  [key]) = 1, [value],null) as Date_VALUE,
        IIF(charindex('Fees',  [key]) = 1, [key],null) as Fees_KEY,  IIF( charindex('Fees',  [key]) = 1, [value],null) as Fees_VALUE
    FROM @data
    CROSS APPLY openjson(replace(replace(x, '\"', '"'), '\r\n', '')) x 
) t
GROUP BY id

这将产生

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL 在两个值之间拆分字符串

如何将单个字符串拆分为两个不同的列sql

T-SQL提取两个已知字符之间的字符串

两个斜杠之间的T-SQL子字符串提取数据

如何限制子字符串以提取SQL Server中两个空格之间的文本?

Hive SQL提取两个非字母数字字符之间长度不同的字符串

在sql中提取两个字符之间的字符串

T-SQL函数将带有两个定界符的字符串拆分为表中的列分隔符

我有一列包含评论。我需要将两个已知单词之间的值细分为字符串。的SQL

如何将一行拆分为两个字符串,然后将第二个字符串复制到SQL的单独列中?

如何在两个 SAME 分隔符 T-SQL 之间提取字符串?

两个特殊字符之间的字符串impala sql

比较SQL中的两个时间字符串

如何在SQL Server列的两个字符串之间选择一个字符串?

SQL查询以选择两个html标记之间的字符串

使用Java字符串的两个日期之间的SQL语句

这两个SQL Server连接字符串之间有什么区别

如何在两个句点之间选择字符串 (SQL Server 2012)

如何将列中的字符串拆分为行(在两行上,匹配位置)SQL

SQL 将字符串拆分为列

在SQL Server中将字符串拆分为列

SQL - 在之后将连接的字符串拆分为列;

如何基于Oracle SQL中的模式提取两个字符串之间的数据

SQL删除两个字符之间的字符串

删除 Hive SQL 查询中两个子字符串之间的所有字符

如何在SQL Server的两个varchar字符串之间找到一个字符串?

将长字符串的列拆分为每行sql 1个单词

sql server 2012:函数获取给定字符串的位置,然后获取给定位置的字符串

识别长字符串中的两个连续字符是字母数字 (SQL)