簡體   English   中英

從表中選擇,具體取決於where子句中的參數

[英]Select from table depending on a parameter in where clause

我正在寫一個“簡單的” SQL函數,該函數根據WHERE子句中的參數選擇數據:

DECLARE @csp AS CHAR(1) = 'F'

SELECT  [NUMERO_DOSSIER]
FROM    [dbo].[Dossier]
WHERE   
    [CSP] IN
    (
        CASE @csp
            WHEN 'F' THEN
                (SELECT [CSP] FROM [dbo].[CSP_1])
            WHEN 'N' THEN
                (SELECT [CSP] FROM [dbo].[CSP_2])
            END
    )

根據SQL Server 2012,此查詢沒有語法錯誤。但是運行查詢會返回以下錯誤:

消息512,級別16,狀態1,第2行子查詢返回的值超過1。 當子查詢遵循=,!=,<,<=,>,> =或將子查詢用作表達式時,不允許這樣做。

據我了解,這里的問題是: CASE函數返回標量,而不能返回表。

我該如何重寫才能使其正常工作?

不要在WHERE子句中使用CASE -通常會使邏輯更加復雜。 只需將邏輯擴展為布爾邏輯即可:

WHERE ( @csp = 'F' AND [CSP] IN (SELECT [CSP] FROM [dbo].[CSP_1]) ) OR
      ( @csp = 'N' AND [CSP] IN (SELECT [CSP] FROM [dbo].[CSP_2]) ) 

一種方法是使用UNION ALL子查詢:

SELECT  [NUMERO_DOSSIER]
FROM    [dbo].[Dossier]
WHERE   
    [CSP] IN
    (
        SELECT [CSP] 
        FROM [dbo].[CSP_1]
        WHERE @csp = 'F'
        UNION ALL
        SELECT [CSP] 
        FROM [dbo].[CSP_2]
        WHERE @csp = 'N'
    );

使用兩個CTE和兩個JOIN操作:

DECLARE @csp AS CHAR(1) = 'F'

;WITH Table1 AS (
    SELECT [CSP] 
    FROM [dbo].[CSP_1]
), Table2 AS (
    SELECT [CSP] 
    FROM [dbo].[CSP_2]
)
SELECT  [NUMERO_DOSSIER]
FROM  [dbo].[Dossier] AS d
JOIN Table1 AS t1 ON @csp = 'F' AND d.CSP = t1.CSP
JOIN Table2 AS t2 ON @csp = 'N' AND d.CSP = t2.CSP

編輯:

看到@Dan的答案后,這可能會更干凈:

;WITH Table1 AS (
    SELECT [CSP] 
    FROM [dbo].[CSP_1]
    WHERE @csp = 'F'
), Table2 AS (
    SELECT [CSP] 
    FROM [dbo].[CSP_2]
    WHERE @csp = 'N'
)
SELECT  [NUMERO_DOSSIER]
FROM  [dbo].[Dossier] AS d
JOIN Table1 AS t1 ON d.CSP = t1.CSP
JOIN Table2 AS t2 ON d.CSP = t2.CSP

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM