【问题标题】:SQL Server 2014 Read json values within an array held in NVARCHAR columnSQL Server 2014 读取 NVARCHAR 列中保存的数组中的 json 值
【发布时间】:2018-04-28 09:25:04
【问题描述】:

我有一个包含 3 列的表格:

id INT, name NVARCHAR(50), myData NVARCHAR(MAX)

myData 只保存一个类似

的 json 字符串数组
["Fingers"]
["Fingers","Right-"]
["Arm","Fingers","Left-"]

我想选择1列中的所有值,比如

Fingers
Fingers
Right-
Arm
Fingers
Left-

我该怎么办?我不相信 SQL Server 2014 可以读取 JSON 数据。

完成后,我可以通过执行SELECT DISTINCT 语句来选择每个唯一值。

我需要能够使用 T-SQL 执行此操作,并且无法创建任何函数来处理此问题,必须仅是 T-SQL。

非常感谢任何帮助。

【问题讨论】:

  • 我不认为这是一个有效的 json 格式? JSON 不需要键:值对吗?
  • 我认为您的 JSON 看起来像 [ { "Array": [ {"value":"Fingers"}, {"value":[{"value":"Fingers"},{"value":"Right-"}]}, {"value":[{"value":"Arm"},{"value":"Fingers"},{"value":"Left-"}]} ] } ] 。 OPENJSON 非常适合您的解决方案:docs.microsoft.com/en-us/sql/relational-databases/json/… 请查看stackoverflow.com/a/37218450/6923146
  • @HardikMasalawala json 从 SqlServer 2016 支持。问题是,我们在 2014 年 :)

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

请使用这个,其中 [#json] 是您的原始表格:

;with [data] as
(
    select [mydata] = replace(replace(replace([mydata], '[', SPACE(0)), ']', space(0)), '"', space(0)) from [#json]
)
,[split] as
(
    select
        [mydata] = [s].[str]
    from
        [data] as [d]
    cross apply
        (       
            select 
                [str] = [x].[c].[value]('(./text())[1]', 'nvarchar(4000)')
            from 
                ( 
                    select [x] = convert(xml, '<i>' + replace([d].[mydata], ',', '</i><i>') + '</i>').[query]('.')
                ) as [a] 
            cross apply 
                [x].[nodes]('i') as [x]([c])
        ) as [s]
)
select 
    [mydata] 
from 
    [split];

完整测试查询:https://pastebin.com/r4AwxPYS

【讨论】:

  • 这太棒了....只是问..没有WITH可能吗?只使用 SELECT 语句?
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多