如果不匹配则子查询 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