如何在sql存储过程中使用具有1=1和1=0条件的json列获取数据

问题描述 投票:0回答:1

钓具台:

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 进行查询不是一个好的做法,请建议我其他方法。

sql-server
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'))
© www.soinside.com 2019 - 2024. All rights reserved.