【问题标题】:Retrieve json value into columns when values are not named未命名值时将 json 值检索到列中
【发布时间】:2020-10-15 14:51:36
【问题描述】:

我在表中有一个名为 Username(varchar max,允许空值)的列。该表可能有多个条目都存储在此列中。目前以这种格式显示:

["name1","name2"]

我正在尝试将 name1 和 name2 提取到单独的行中。我不知道该怎么做。这是我目前最接近的查询:

select u.id, a.[Username]
from dbo.Users u
CROSS APPLY OPENJSON(Username) WITH ([Username] varchar(max)) a

这是将它们正确地按行拉出,但行显示 NULL 而不是值。我检查了该名称是否与语法中的列名匹配,并且确实如此。

【问题讨论】:

  • 删除WITH 子句。
  • 您可以通过在 WITH 子句中传递 $ 路径来命名嵌套在数组中的 JSON 值 - SELECT a.Username FROM OPENJSON('["John","Kat"]') WITH ([Username] varchar(max) '$') a

标签: json sql-server


【解决方案1】:

OPENJSON 函数正在查找名为“用户名”的列。相反,尝试给 OPENJSON 'oj' 一个别名并在不指定模式的情况下打开 JSON。然后将 oj.value 添加到 SELECT 列表中。像这样的

select u.id, oj.[value] as Username
from dbo.Users u
     cross apply openjson(u.Username) oj;

【讨论】:

    【解决方案2】:

    documentation 中解释了意外结果的原因:"...OPENJSON 将 jsonExpression 中的键与 with_clause 中的列名匹配(在这种情况下,匹配键意味着它区分大小写)。如果列名与键名不匹配,您可以提供可选的 column_path..."。您的输入 JSON 是一个标量值数组,并且没有键 "username"

    但是,您可以OPENJSON() 与显式架构(WITH 子句)一起使用。只需使用正确的路径(在您的情况下为'$')。

    表:

    CREATE TABLE Users (id int, username varchar(max))
    INSERT INTO Users (id, username) VALUES (1, '["name1","name2"]')
    

    声明:

    SELECT u.id, a.[username]
    FROM Users u
    CROSS APPLY OPENJSON (u.[username]) WITH ([username] varchar(max) '$') a
    

    结果:

    id  username
    1   name1
    1   name2
    

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2020-07-30
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2017-12-06
      • 2017-03-30
      相关资源
      最近更新 更多