我有一个查询,当我检查,如果过滤器是NULL,则我选择所有,但如果它们不为空,我只选择具有这些过滤器的对象。查询如下。
SELECT *
FROM [PointOfInterest]
WHERE [PointOfInterest].[Id] IN (CASE
WHEN @filters IS NULL THEN [PointOfInterest].[Id]
WHEN @filters IS NOT NULL THEN (SELECT DISTINCT [PointOfInterestIcon].[PointOfInterestId]
FROM [PointOfInterestIcon]
WHERE [IconId] IN (SELECT [Id] FROM OPENJSON(@filters)WITH([Id] NVARCHAR(255))))
END)
如果我删除CASE语句,把只有SELECT的查询工作。任何想法如何解决这一问题?
只要使用正规布尔逻辑:
SELECT *
FROM [PointOfInterest]
WHERE @filters IS NULL OR
[PointOfInterest].[Id] IN (SELECT poi.[PointOfInterestId]
FROM [PointOfInterestIcon] poi
WHERE poiIconId IN (SELECT [Id] FROM OPENJSON(@filters) WITH ([Id] NVARCHAR(255)))
);
你有一个内部的选择是不是行返回更多..你可以使用TOP 1的上限这一结果
SELECT *
FROM [PointOfInterest]
WHERE [PointOfInterest].[Id] IN (
CASE
WHEN @filters IS NULL THEN [PointOfInterest].[Id]
WHEN @filters IS NOT NULL THEN (
SELECT TOP 1 DISTINCT [PointOfInterestIcon].[PointOfInterestId]
FROM [PointOfInterestIcon]
WHERE [IconId] IN (
SELECT [Id] FROM OPENJSON(@filters)WITH([Id] NVARCHAR(255))))
END)