【发布时间】:2018-10-10 05:05:50
【问题描述】:
我正在尝试使用JSONtype 作为存储过程的输入参数,以对返回数据进行一些过滤。
我有以下TableA:
CREATE TABLE TableA (
Id INT NULL,
Value1 VARCHAR(25) NULL,
Value2 VARCHAR(25) NULL
);
INSERT INTO TableA (Id, Value1, Value2) values (1, 'test1', 'new1')
INSERT INTO TableA (Id, Value1, Value2) values (1, 'test1', 'new2')
INSERT INTO TableA (Id, Value1, Value2) values (null, null, 'test3')
INSERT INTO TableA (Id, Value1, Value2) values (2, 'myvalue1', 'newvalue')
JSON 参数是动态的 - 表示上表中的一个或多个列名和值。
DECLARE @Filter NVARCHAR(MAX)
SET @Filter=N'{
"Id": 2,
"Value1": "myvalue1",
"Value2": "newvalue"
}'
然后我从json 和inner join 中提取数据并使用TableA 得到我需要的输出:
...
;WITH cte AS
(
SELECT * FROM OPENJSON(@Filter)
WITH(Id INT,
Value1 VARCHAR(25),
Value2 VARCHAR(25))
)
SELECT a.* FROM cte ct
INNER JOIN TableA a
ON ct.Id = a.Id
INNER JOIN TableA b
ON ct.Value1 = b.Value1
INNER JOIN TableA c
ON ct.Value2 = c.Value2
在这个特定的示例中,我得到了所需的输出,因为我指定了所有列。然而,使用JSON 作为参数背后的全部原因是能够动态传递不同的列(实际的表有更多的列)。
如果我想通过以下过滤器,我将不再获得所需的输出,因为inner join。
SET @Filter=N'{
"Id": 2,
}'
...
SET @Filter=N'{
"Id": 2,
"Value1": "test1"
}'
...
SET @Filter=N'{
"Value1": "test1,
"Value1": "new2"
}'
...etc
- 有没有办法从 json 中动态选择所有具有值的对象并跳过空值?或者关于如何解决此问题的任何其他建议?
- 有没有办法检查 json 中是否有任何对象?根据文档,只有一个函数
ISJSON可以验证以确保其格式正确。但是,如果我通过:SET @Filter=N'{}'它是一个有效的 json 对象,但它是空的。
【问题讨论】:
-
顺便说一句:这是一个非常好的问题!可消耗的 DDL 和数据,自己的尝试,清晰的解释 - 我希望我们有更多这样的 :-) +1 从我身边!
标签: sql json sql-server-2017