未命名值时将json值检索到列中

问题描述

我在表中有一个名为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而不是值。我检查了名称是否与语法中的列名称匹配,并且确实如此。

解决方法

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

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

documentation中解释了导致意外结果的原因:“ ...... OPENJSON将jsonExpression中的键与with_clause中的列名进行匹配(在这种情况下,matches键表示它区分大小写)。如果列名与键名不匹配,则可以提供可选的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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...