我的表中有一列中有 JSON 数据。我正在尝试在 JSON 列上应用 where 条件并获取记录。
Employee
桌子:
这是我的 SQL 查询:
SELECT ID, EMP_NAME
FROM EMPLOYEE
WHERE JSON_VALUE(TEAM, '$') IN (2, 3, 4, 5, 7, 10)
使用此查询时,我得到一个空结果。有关如何执行此操作的任何帮助?
我的表中有一列中有 JSON 数据。我正在尝试在 JSON 列上应用 where 条件并获取记录。
Employee
桌子:
这是我的 SQL 查询:
SELECT ID, EMP_NAME
FROM EMPLOYEE
WHERE JSON_VALUE(TEAM, '$') IN (2, 3, 4, 5, 7, 10)
使用此查询时,我得到一个空结果。有关如何执行此操作的任何帮助?
您需要使用以下内容解析TEAM
列中的 JSON OPENJSON()
:
桌子:
CREATE TABLE EMPLOYEE (
ID int,
EMP_NAME varchar(50),
TEAM varchar(1000)
)
INSERT INTO EMPLOYEE (ID, EMP_NAME, TEAM)
VALUES
(1, 'Name1', '[2,11]'),
(2, 'Name2', '[2,3,4,5,7,10]'),
(3, 'Name3', NULL)
陈述:
SELECT DISTINCT e.ID, e.EMP_NAME
FROM EMPLOYEE e
CROSS APPLY OPENJSON(e.TEAM) WITH (TEAM int '$') j
WHERE j.TEAM IN (2,3,4,5,7,10)
结果:
ID EMP_NAME
1 Name1
2 Name2
作为附加选项,如果要将匹配项作为聚合文本获取,可以使用以下语句(需要 SQL Server 2017):
SELECT e.ID, e.EMP_NAME, a.TEAM
FROM EMPLOYEE e
CROSS APPLY (
SELECT STRING_AGG(TEAM, ',') AS TEAM
FROM OPENJSON(e.TEAM) WITH (TEAM int '$')
WHERE TEAM IN (2,3,4,5,7,10)
) a
WHERE a.TEAM IS NOT NULL
结果:
ID EMP_NAME TEAM
1 Name1 2
2 Name2 2,3,4,5,7,10
JSON_VALUE
返回一个标量值,而不是您认为会的数据集。如果你运行SELECT JSON_VALUE('[2,3,4,5,7,10]','$')
,你会看到它返回NULL
,所以是的,不会返回任何行。
您需要将 JSON 视为数据集,而不是单个值:
SELECT ID, EMP_NAME
FROM EMPLOYEE E
WHERE EXISTS (SELECT 1
FROM OPENJSON (E.TEAM) OJ
WHERE OJ.Value IN (2,3,4,5,7,10))