如何交叉应用从 SQL 语句中提取的 [“xxxx”,“xxxx”] 等列值

How can I cross apply a column value like ["xxxx","xxxx"] extracted from a SQL statement

提问人:D.P. OL' RACE 提问时间:8/24/2021 最后编辑:D.P. OL' RACE 更新时间:8/24/2021 访问量:79

问:

TCARDS。IdMembers 包含像这样的 JSON:[“xxxx”,“xxxx”],我想将它与我已经拥有的 JSON 交叉应用。第二个生成错误:CROSS APPLY

消息 102,级别 15,状态 1,第 35 行 “JSON_VALUE”附近的语法不正确。

Screenshot1:这是@JSON_TABLE变量的值。它有 [cards] Key whisch 包含我需要的大部分内容,如下面的 SQL 语句所示 Screenshot2:这是 TCards 的结果,但我想进一步分解 idMembers 并交叉应用它。注意:我必须排除其他列

 DECLARE @JSON_TABLE VARCHAR(MAX)
 SELECT @JSON_TABLE = BulkColumn FROM OPENROWSET(BULK 'C:\Users\User\Desktop\X tasks\updated\Tue, 17 Aug 2021 14_40_18 GMT.json', Single_CLob)J
Select 
TCards.id,
TCards.idList,
TCards.idLabels,
TCards.idMembers,
TCards.idChecklists,
TCards.shortUrl,
TCards.customFieldItems,
TMem.Mm1
from OPENJSON(@JSON_TABLE)
    WITH(
        id varchar(500),
        cards Nvarchar(Max) as JSON
    ) AS TABLEA
CROSS APPLY OPENJSON(TABLEA.cards)
    WITH(
        id nVARCHAR(50),
        dateLastActivity nvarchar(50) '$.dateLastActivity',
        idboard nVARCHAR(50) '$.idBoard',
        idChecklists nvarchar(max) '$.idChecklists' as json,
        idMembers nvarchar(max) '$.idMembers' as json,
        idLabels nVarChar(max) '$.idLabels' as json,        
        customFieldItems nvarchar(max) '$.customFieldItems' as json,
        shortUrl nvarchar(50) '$.shortUrl',
        idList nvarchar(50) '$.idList'
    ) as TCards
CROSS APPLY OPENJSON(TCards.IdMembers) 
   WITH(
      Mm1 nvarchar(50) JSON_VALUE(TCards.IdMembers, '$.[0]')
  ) as TMem
JSON SQL 服务器

评论

1赞 Thom A 8/24/2021
请不要对我们大喊大叫。谢谢。
0赞 Thom A 8/24/2021
样本数据和预期结果将帮助我们为您提供帮助。我怀疑你需要打几个电话,但不可能知道。OPENJSON
0赞 Jeroen Mostert 8/24/2021
根据错误消息,该语法无效。该子句需要类型、路径和可选子句,您不能插入任意表达式,例如 (这些表达式必须移动到 )。WITHAS JSONJSON_VALUESELECT
0赞 D.P. OL' RACE 8/24/2021
@Larnu,我为所有大写字母道歉。我附上了 2 张截图。请帮忙。Jeroen,我需要交叉申请。但是根据屏幕截图,如果JSON_Value可以解决问题,请帮助我正确制定语法。谢谢。
0赞 Thom A 8/24/2021
数据图像无助于我们帮助您,@D.P.OL'RACE .我们无法将该映像复制到 IDE 中。更糟糕的是,图像截断了我们可以看到的数据。花点时间使用 DDL 和 DML 语句制作可消耗品。

答:

0赞 Charlieface 8/24/2021 #1

由于每个数组中只有一个对象,因此可以删除第三个对象并将第二个对象更改为使用滴灌路径OPENJSON'$.idMembers[0]'

Select 
TCards.id,
TCards.idList,
TCards.idLabels,
TCards.idMembers,
TCards.idChecklists,
TCards.shortUrl,
TCards.customFieldItems,
TMem.Mm1
from OPENJSON(@JSON_TABLE)
    WITH(
        id varchar(500),
        cards Nvarchar(Max) as JSON
    ) AS TABLEA
CROSS APPLY OPENJSON(TABLEA.cards)
    WITH(
        id nVARCHAR(50),
        dateLastActivity nvarchar(50) '$.dateLastActivity',
        idboard nVARCHAR(50) '$.idBoard',
        idChecklists nvarchar(max) '$.idChecklists' as json,
        idMembers nvarchar(50) '$.idMembers[0]',
        idLabels nVarChar(max) '$.idLabels' as json,        
        customFieldItems nvarchar(max) '$.customFieldItems' as json,
        shortUrl nvarchar(50) '$.shortUrl',
        idList nvarchar(50) '$.idList'
    ) as TCards

如果你真的想打破数组,你会这样做

Select 
TCards.id,
TCards.idList,
TCards.idLabels,
TCards.idMembers,
TCards.idChecklists,
TCards.shortUrl,
TCards.customFieldItems,
TMem.Mm1
from OPENJSON(@JSON_TABLE)
    WITH(
        id varchar(500),
        cards Nvarchar(Max) as JSON
    ) AS TABLEA
CROSS APPLY OPENJSON(TABLEA.cards)
    WITH(
        id nVARCHAR(50),
        dateLastActivity nvarchar(50) '$.dateLastActivity',
        idboard nVARCHAR(50) '$.idBoard',
        idChecklists nvarchar(max) '$.idChecklists' as json,
        idMembers nvarchar(max) '$.idMembers' as json,
        idLabels nVarChar(max) '$.idLabels' as json,        
        customFieldItems nvarchar(max) '$.customFieldItems' as json,
        shortUrl nvarchar(50) '$.shortUrl',
        idList nvarchar(50) '$.idList'
    ) as TCards
CROSS APPLY OPENJSON(TCards.IdMembers) 
   WITH(
      Mm1 nvarchar(50) '$'
  ) as TMem

如果省略块,则会得到一对,其中是数组索引,是对象WITHkey/valuekeyvalue

评论

0赞 D.P. OL' RACE 8/24/2021
@Charlieface,我对你感激不尽。这对我来说意义重大,伙计。我是 JSON 的新手,它已经让我头疼了将近 2 周,直到我记得问一个问题。上帝永远保佑。