钓具台:
TackleID | 钓具名称 |
---|---|
5e8ef3ed-d02a-4582-85d3-4a993521ed0f | 姓名1 |
f08c1041-e5b8-4f25-b69b-90d6a59d937e | 姓名2 |
处理结果表:
处理结果ID | TackleID | RDI |
---|---|---|
91f50120-dd46-4f10-900d-42e2338dd649 | 5e8ef3ed-d02a-4582-85d3-4a993521ed0f | [{"名称":"SeIds","值":"数据"},{"名称":"ISD","值":"{\"SID\":{\"列\":{\ "城市\":\"喜马偕尔邦\",\"深度\":\"5mts\"}},\"Canded\":false}"}] |
949fc210-7349-4dcf-9a64-08c1259cb3c6 | f08c1041-e5b8-4f25-b69b-90d6a59d937e | [{"名称":"SeIds","值":"数据"},{"名称":"ISD","值":"{\"SID\":{\"列\":{\ "城市\":\"德里\",\"深度\":\"15mts\"}},\"Canded\":false}"}] |
主表:
主ID | TackleID |
---|---|
45e0fa71-5091-4523-87f1-4f04bdd98cd7 | 5e8ef3ed-d02a-4582-85d3-4a993521ed0f |
基于标志 @showDelhi =1 我需要显示 City = Delhi 和 @showDelhi=0 的记录 我需要显示 City=Himachal 的记录
我写了如下查询:
Declare @MainId uniqueidentifier='45e0fa71-5091-4523-87f1-4f04bdd98cd7'
Declare @showDelhi bit = 0;
SELECT TG.TackleID
FROM Main P
INNER JOIN Tackle TG ON TG.TackleID = P.TackleID
INNER JOIN TackleResult TRD on TRD.TackleID = TG.TackleID
WHERE P.MainId = @MainId
AND (1 = @showDelhi OR ((SELECT City FROM OPENJSON((SELECT VALUE FROM OPENJSON (CONVERT (VARCHAR(MAX),TRD.RDI))with( Name nvarchar(100), Value nvarchar(max)) where Name='ISD')
) WITH (City NVARCHAR(100) '$.SID.column.City')) not like '%Himachal%'))
当 @showDelhi = 1 时,上面的查询工作正常,但当 @showDelhi = 0 时,它会抛出以下错误:
JSON 文本格式不正确。在位置 2 处发现意外字符“t”。
不明白问题出在哪里。
如果使用 1=1 和 1=0 进行查询不是一个好的做法,请建议我其他方法。
如果您的表 (
'[{"Name":"SeIds","Value":"Data"},{"Name":"ISD","Value":{"SID":{"column":{"City":"Himachal","Depth":"15mts"}},"Canded":false}}]
) 中有有效的 JSON 内容并使用问题中的表,则可能的方法是以下语句:
DECLARE @MainId uniqueidentifier = '45e0fa71-5091-4523-87f1-4f04bdd98cd7';
DECLARE @showDelhi bit = 1;
SELECT TG.TackleID
FROM Main P
INNER JOIN Tackle TG ON TG.TackleID = P.TackleID
INNER JOIN TackleResult TRD on TRD.TackleID = TG.TackleID
OUTER APPLY (
SELECT City
FROM OPENJSON(TRD.RDI) WITH (
Name nvarchar(100) '$.Name',
City nvarchar(100) '$.Value.SID.column.City'
)
WHERE (Name = 'ISD')
) J
WHERE
(P.MainId = @MainId) AND
((@showDelhi = 1 AND J.City = 'Delhi') OR (@showDelhi = 0 AND J.City = 'Himachal'))