contractTypes 列中每一行的数据是一个有效的 JSON 数组,因此您可以使用带有显式架构的OPENJSON()(结果是一个包含在WITH 子句中定义的列的表)来解析这个数组并得到预期的结果:
表:
CREATE TABLE Data (
offerId int,
contractTypes varchar(1000)
)
INSERT INTO Data
(offerId, contractTypes)
VALUES
(1, '[ "Hlavni pracovni pomer" ]'),
(2, '[ "ÖCVS", "Staz", "Prahovne" ]')
表:
SELECT d.offerId, j.contractTypes
FROM Data d
OUTER APPLY OPENJSON(d.contractTypes) WITH (contractTypes varchar(100) '$') j
结果:
offerId contractTypes
1 Hlavni pracovni pomer
2 ÖCVS
2 Staz
2 Prahovne
作为附加选项,如果您想在contractTypes 数组中返回合约类型的位置,您可以使用带有默认架构的OPENJSON()(结果是一个包含列key、value 和type 和 key 列中的值是数组中元素的从 0 开始的索引):
SELECT
d.offerId,
CONVERT(int, j.[key]) + 1 AS contractId,
j.[value] AS contractType
FROM Data d
OUTER APPLY OPENJSON(d.contractTypes) j
ORDER BY CONVERT(int, j.[key])
结果:
offerId contractId contractType
1 1 Hlavni pracovni pomer
2 1 ÖCVS
2 2 Staz
2 3 Prahovne