2010-07-01 115 views
6

是否有可能在when語句的case子句中寫入子查詢在case子句中的SQL相關子查詢

ie。

SELECT colA, colB, 
CASE WHEN (SELECT colA FROM tab2 WHERE tab2.colA = tab1.colA) THEN '1' 
CASE WHEN (SELECT colA FROM tab3 WHERE tab3.colA = tab3.colA) THEN '2' 
ELSE '0' 
END AS colC, 
... 
FROM tab1 

擴展問題:
是否有可能基於該值列做些什麼? (很確定是的,但想要確認)
即。

CASE 
WHEN colC = '1' THEN (select colR FROM...), 
WHEN colC = '2' THEN (SELECT ColS FROM...), 
ELSE 'doesn't work' 
END AS colD 

此外,上述情況允許返回多個不同的列,這取決於colC是哪個值?
即。

CASE 
WHEN colC = '1' THEN (select colR, colV, colX FROM...), 
WHEN colC = '2' THEN (SELECT ColS, ColD FROM...), 
ELSE 'doesn't work' 
END AS colD 

謝謝!

回答

4

是有可能的,當 聲明

我認爲情況子句中寫一個子查詢 這是你在問什麼:

SELECT colA, colB, 
     CASE 
      WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
      THEN '1' 
      WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
      THEN '2' 
      ELSE '0' 
     END AS colC 
    FROM tab1; 

是否可以在該值柱上做一些基於 的事情? N

你能做到這一點,這在第二CASE表達式使用的可樂,而不是COLC:

SELECT colA, colB, 
     CASE 
      WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
      THEN '1' 
      WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
      THEN '2' 
      ELSE '0' 
     END AS colC, 
     CASE 
      WHEN colA = '1' THEN (SELECT colA FROM tab2) 
      WHEN colA = '2' THEN (SELECT colB FROM tab3) 
      ELSE 'doesn''t work' 
     END AS colD 
    FROM tab1; 

[請注意,您將需要小心鑄造第二CASE表達式的結果,以一個共同的數據類型,想必VARCHAR考慮「那並不工作」的默認值。]

不過,我認爲你詢問是否可以「再利用」一CASE表達的相同結果3210子句,在這種情況下是colC。對此的答案是否定的,因爲相關名稱不在範圍**中。當然,你可以把它包在一個子查詢(或CTEVIEW等):

SELECT DT1.colA, DT1.colB, DT1.colC, 
     CASE 
      WHEN DT1.colC = '1' THEN (SELECT colA FROM tab2) 
      WHEN DT1.colC = '2' THEN (SELECT colB FROM tab3) 
      ELSE 'doesn''t work' 
     END AS colD 
    FROM (  
     SELECT colA, colB, 
       CASE 
        WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
        THEN '1' 
        WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
        THEN '2' 
        ELSE '0' 
       END AS colC 
      FROM tab1 
     ) AS DT1; 

**我立足我的標準SQL的知識,而不是DB2。例如,MS Access允許您以相同的SELECT子句以從右到左的方式使用列相關名稱,但這只是確認Access不會實現SQL語言!


是允許返回 多個和不同列 取決於哪個上述情況下的值是COLC

不同的列是,多列沒有。想想看:CASE表達式返回一個值,那麼什麼樣的數據類型會有兩列值呢?表,列表,數組等?標量值是1NF的要求。

+0

感謝您的建議和解釋。 – Tyug 2010-07-04 18:05:35

2

案例語句評估爲單個值,因此您無法從中返回多個列。您可以在Where子句中使用相關的子查詢,儘管您沒有在您嘗試使用該示例的位置顯示示例。 colC是否適用於Where子句取決於您的數據庫引擎。我曾與一些做過的工作以及其他需要您重新運行Where子句中的子查詢的人一起工作。

+0

感謝您的解釋!僅供參考,它適用於DB2。 – Tyug 2010-07-04 18:06:30

1

是有可能寫出的情況下子句中的子查詢的時候聲明

是。正如g.d.d.c回答的那樣,它必須是一個返回單個值的子查詢。這意味着零或一行和一列或值。

是否可以根據該值列做些什麼?

是的,與上述相同的注意事項。

此外,上述情況允許返回多個不同的列,這取決於colC是哪個值?

否。子查詢必須返回零或一行,並且只返回一列或值。