SQL子查询返回多个结果

问题描述 投票:2回答:2

我有一个查询,当我检查,如果过滤器是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的查询工作。任何想法如何解决这一问题?

sql sql-server tsql
2个回答
5
投票

只要使用正规布尔逻辑:

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)))
                                );

1
投票

你有一个内部的选择是不是行返回更多..你可以使用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)
© www.soinside.com 2019 - 2024. All rights reserved.