[英]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.