如果不匹配则子查询 return 所有行
Subquery return all rows if no match
我正在使用 JSON
对象来过滤 WHERE
子句中的数据。如果找到匹配 return 那些行,但是,如果没有匹配 return 所有行。
这是一个示例:
CREATE TABLE MyTable
(
Id int identity(1,1) primary key,
SomeObject varchar(20),
SomeText varchar(20)
)
INSERT INTO MyTable(SomeObject, SomeText) VALUES ('hello', 'test1')
INSERT INTO MyTable(SomeObject, SomeText) VALUES ('yellow', 'test2')
INSERT INTO MyTable(SomeObject, SomeText) VALUES ('test1', 'test1')
使用的 JSON
过滤器:
DECLARE @Filter nvarchar(MAX)
SET @Filter = N'{
"SomeObject": "ello,yel"
}'
在下面的示例中,要获取 SomeObject
列中包含部分文本 ello and yel
的行,我有以下工作查询。
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject LIKE CONCAT('%', [Value], '%'))
但是如果我更改过滤器并且不指定 SomeObject
SET @Filter = N'{
}'
上述查询将不再有效,因为找不到匹配项。为了解决这个问题,我尝试了以下两个查询,但仍然没有得到正确的输出。
1.
--This query will ALWAYS return all the rows regardless of the filter being passed even though some of those will have a match.
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT ISNULL(
(
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject LIKE CONCAT('%', [Value], '%'))
),0)
)
2.
--Works ONLY if filter specified. If filter is missing will not return all rows.
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject IS NULL AND JSON_VALUE(@Filter, N'$.SomeObject') IS
NULL OR mt.SomeObject LIKE CONCAT('%', [Value], '%'))
)
如果在 subquery
中找不到匹配项,我如何 return 所有行有什么建议吗?
如果您像上面那样默认设置过滤器,即 {
和 CR
然后 }
那么您可以将此作为默认设置:
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject LIKE CONCAT('%', [Value], '%')))
OR replace(@Filter,char(10),'') = '{}'
否则,您可以通过将变量设置为 NULL
或空白 space 或其他任何方式来解释它。在此处查看演示:DEMO
我正在使用 JSON
对象来过滤 WHERE
子句中的数据。如果找到匹配 return 那些行,但是,如果没有匹配 return 所有行。
这是一个示例:
CREATE TABLE MyTable
(
Id int identity(1,1) primary key,
SomeObject varchar(20),
SomeText varchar(20)
)
INSERT INTO MyTable(SomeObject, SomeText) VALUES ('hello', 'test1')
INSERT INTO MyTable(SomeObject, SomeText) VALUES ('yellow', 'test2')
INSERT INTO MyTable(SomeObject, SomeText) VALUES ('test1', 'test1')
使用的 JSON
过滤器:
DECLARE @Filter nvarchar(MAX)
SET @Filter = N'{
"SomeObject": "ello,yel"
}'
在下面的示例中,要获取 SomeObject
列中包含部分文本 ello and yel
的行,我有以下工作查询。
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject LIKE CONCAT('%', [Value], '%'))
但是如果我更改过滤器并且不指定 SomeObject
SET @Filter = N'{
}'
上述查询将不再有效,因为找不到匹配项。为了解决这个问题,我尝试了以下两个查询,但仍然没有得到正确的输出。
1.
--This query will ALWAYS return all the rows regardless of the filter being passed even though some of those will have a match.
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT ISNULL(
(
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject LIKE CONCAT('%', [Value], '%'))
),0)
)
2.
--Works ONLY if filter specified. If filter is missing will not return all rows.
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject IS NULL AND JSON_VALUE(@Filter, N'$.SomeObject') IS
NULL OR mt.SomeObject LIKE CONCAT('%', [Value], '%'))
)
如果在 subquery
中找不到匹配项,我如何 return 所有行有什么建议吗?
如果您像上面那样默认设置过滤器,即 {
和 CR
然后 }
那么您可以将此作为默认设置:
SELECT mt.*
FROM MyTable mt
WHERE EXISTS (
SELECT *
FROM STRING_SPLIT(JSON_VALUE(@Filter, '$.SomeObject'), ',')
WHERE (mt.SomeObject LIKE CONCAT('%', [Value], '%')))
OR replace(@Filter,char(10),'') = '{}'
否则,您可以通过将变量设置为 NULL
或空白 space 或其他任何方式来解释它。在此处查看演示:DEMO