给出一个变量SYMBOL2
,它是一个@PartsData
并包含一组json数据,此查询可以正常工作:
VARCHAR(MAX)
但是,假设我想在从jason打开数据时转换一些数据:
SELECT
*
FROM OPENJSON(@PartsData)
WITH (
PartId INT 'strict $.PartId',
....
CultureName VARCHAR(3) '$.CultureName',
PartDescription VARCHAR(2000) '$.PartDescription'
) A
关于此,我得到:
关键字“ CONVERT”附近的语法不正确。
这可以,但是我需要原始SELECT
*
FROM OPENJSON(@PartsData)
WITH (
PartId INT 'strict $.PartId',
....
CultureName VARCHAR(3) '$.CultureName',
PartDescription VARCHAR(2000) '$.PartDescription'
PhraseHash UNIQUEIDENTIFIER CONVERT([uniqueidentifier],hashbytes('MD2',concat('$.PartDescription', '$.CultureName'))
) A
中的计算值,以便可以加入它:
WITH
答案 0 :(得分:1)
WITH
子句不适用于此情况,但是您可以使用CROSS APPLY
计算所需的值行明智,并在联接中使用该值。此示例中的内容:
DECLARE @tbl TABLE(ID INT,SomeValue VARCHAR(100));
INSERT INTO @tbl VALUES
(1020,'Values 10 and 20')
,(2030,'Values 20 and 30');
DECLARE @json NVARCHAR(MAX)=
N'{
"rows":
[{"id":"1","val1":"10","val2":"20"},
{"id":"2","val1":"20","val2":"30"},
{"id":"3","val1":"20","val2":"30"},
{"id":"4","val1":"40","val2":"30"}
]
}';
SELECT *
FROM OPENJSON(@json,'$.rows')
WITH(id INT,val1 NVARCHAR(10),val2 NVARCHAR(10)) A
CROSS APPLY(SELECT CAST(CONCAT(A.val1,A.val2) AS INT)) B(ConcatenatedAndCasted)
INNER JOIN @tbl t ON t.ID=B.ConcatenatedAndCasted;
关于下一个问题:请尝试自行设置MCVE(如我上面所做的那样)。添加样本数据和预期的输出。添加您自己的尝试并解释为什么您的输出不能满足您的需求。这将帮助一千多个单词...
您也可以从JSON数据中检索派生表,如下所示:
WITH JSON_Data AS
(
SELECT *
FROM OPENJSON(@json,'$.rows')
WITH(id INT,val1 NVARCHAR(10),val2 NVARCHAR(10)) A
)
SELECT * FROM @tbl t
INNER JOIN JSON_Data jd ON t.ID=CAST(CONCAT(jd.val1,jd.val2) AS INT);
实际上,有各种使用CTE,子查询,应用甚至临时表的方法。哪一个最适合您,取决于行数和您的需求...