簡體   English   中英

在 WHERE 子句中使用 case 語句或 IF

[英]Using case statement or IF inside a WHERE clause

我有幾個幾乎相同的存儲過程,但在 WHERE 子句中有一些不同的 AND 部分。

基於變量deptname ,我想向我已經存在的 WHERE 子句添加額外的 AND/OR 條件。 所以有點像 IF/CASE WHEN 在不同的部分。

將其視為字符串連接

query_string = 'WHERE a= XYZ AND B= 123"
if deptname = a:  query_string + "AND additional conditions for dept a"
else if deptname = b:query_string + "AND additional conditions for dept b"

使用變量的適當方法是什么?

這是我正在嘗試做的一些偽代碼

SELECT 
personID AS pid,
personcode,
persondeptcode,
more_fields AS fields
FROM
TABLE_XYZ
WHERE
--shared parts
personcode = 'C' 
AND
persondeptcode = 'MAJ'
--- NOW the different part
IF @deptname = "deptA"
AND 
(
PROGRAM_LDESCR IN 
(
    'prog1',
    'prog2',
    'prog3'
)
OR
aprogram IN ('aprogram1') 
OR 
(aprogram IN ('aprogram2') AND PLAN_LDESCR IN ('plan123'))
); 
--- THIS IS A DIFFERENT DEPT SO WE HAVE DIFFERENT AND PART 
ELSE IF @deptname = "deptB"

(
PROGRAM_LDESCR IN 
(
    '1234'
)
OR
aprogram IN ('a1234') 
);

你似乎想要這樣的東西:

AND
(@deptname = 'dept123' AND (PROGRAM_LDESCR IN ('1234') OR aprogram IN ('a1234')) OR
 @deptname <> 'dept123'
)

要結合WHERE子句的最后一部分(如果我正確理解您的注釋代碼),您可以執行以下操作:

SELECT 
    personID AS pid,
    personcode,
    persondeptcode,
    more_fields AS fields
FROM
    TABLE_XYZ
WHERE
    personcode = 'C' 
    AND persondeptcode = 'MAJ'
    AND (
        (@deptname="deptA" AND (PROGRAM_LDESCR IN ('prog1', 'prog2', 'prog3') OR aprogram IN ('aprogram1') OR (aprogram IN ('aprogram2') AND PLAN_LDESCR IN ('plan123'))))
        OR
        (@deptname="deptB" AND (PROGRAM_LDESCR IN ('1234') OR aprogram IN ('a1234'))
    )

通常,如果您想實際更改SELECT語句中的值,您將使用WHERE子句過濾掉不必要的數據行和CASE語句(我很少看到SELECT子句之外的CASE語句,除非它正在執行類似復雜排序的操作) )。

在這種情況下,您可以使用CASE表達式,重要的是確保您有一個ELSE子句,以確保如果@deptname不是具有額外條件的兩個值之一,則表達式仍然為真:

WHERE personcode = 'C' 
  AND persondeptcode = 'MAJ'
  AND (CASE @deptname 
       WHEN "deptA" THEN PROGRAM_LDESCR IN ('prog1', 'prog2', 'prog3')
                      OR aprogram IN ('aprogram1') 
                      OR aprogram IN ('aprogram2') AND PLAN_LDESCR IN ('plan123')
       WHEN "deptB" THEN PROGRAM_LDESCR IN ('1234')
                      OR aprogram IN ('a1234')
       ELSE 1
       END)

是以這種方式使用的CASE表達式的簡單演示。

暫無
暫無

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

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