2016-11-02 46 views
0

我寫了一個查詢,看起來像這樣:SQL - 我應該添加一個IF或CASE到這個WHERE子句嗎?

SELECT 
xx.DATE 
xx.TRANSACTION_ID 
xx.ID 
xx.CODE 

FROM TABLE_X xx 

WHERE 
xx.DATE >= TO_DATE('2015-01-01', 'YYYY-MM-DD') 
AND xx.ID IN 
(SELECT 
yy.id 
FROM TABLE_Y yy 
WHERE 
yy.status = 'OPEN' 
AND yy.type = 1 
AND trunc(yy.date) = TO_DATE('{FREE_FORM}', 'YYYY-MM-DD') 
) 

ex.TABLE_X

DATE  TRANSACTION_ID ID  CODE 
1/1/2015 1020   CAT  RED 
1/1/2015 1010   CAT  GREEN 
1/2/2015 2020   DOG  RED 
1/2/2015 2010   DOG  GREEN 
1/3/2015 3030   RABBIT BLUE 
1/3/2015 3020   SPIDER RED 
1/3/2015 3010   RABBIT GREEN 
1/4/2015 4020   CAT  RED 
1/4/2015 4010   SNAKE GREEN 
1/4/2015 4000   MONKEY ORANGE 
1/5/2015 5020   HORSE RED 
1/5/2015 5010   COW  GREEN 

ex.TABLE_Y

date  id  status type 
1/1/2015 CAT  OPEN 1 
1/2/2015 DOG  OPEN 1 
1/3/2015 RABBIT OPEN 1 

有了這些例子表我的電流輸出爲:

ex.output

DATE  TRANSACTION_ID ID  CODE 
1/1/2015 1020   CAT  RED 
1/1/2015 1010   CAT  GREEN 
1/2/2015 2020   DOG  RED 
1/2/2015 2010   DOG  GREEN 
1/3/2015 3030   RABBIT BLUE 
1/3/2015 3010   RABBIT GREEN 
1/4/2015 4020   CAT  RED 

我想補充的東西,也許在WHERE子句,如:

if (ex.output.CODE = RED){ 
SELECT 
xx.DATE 
xx.TRANSACTION_ID 
xx.ID 
xx.CODE 

FROM TABLE_X xx 

WHERE xx.TRANSACTION_ID = ex.output.TRANSACTION_ID - 10 
} 
AND 
if (ex.output.CODE = GREEN){ 
SELECT 
xx.DATE 
xx.TRANSACTION_ID 
xx.ID 
xx.CODE 

FROM TABLE_X xx 

WHERE xx.TRANSACTION_ID = ex.output.TRANSACTION_ID + 10 
} 

我的目標是與輸出到結束:

DATE  TRANSACTION_ID ID  CODE 
1/1/2015 1020   CAT  RED 
1/1/2015 1010   CAT  GREEN 
1/2/2015 2020   DOG  RED 
1/2/2015 2010   DOG  GREEN 
1/3/2015 3030   RABBIT BLUE 
1/3/2015 3020   SPIDER RED 
1/3/2015 3010   RABBIT GREEN 
1/4/2015 4020   CAT  RED 
1/4/2015 4010   SNAKE GREEN 

這可能嗎?

+0

你爲什麼不放在'那裏clause'的條件,然後'union'兩個結果? – Prisoner

+0

請詳細說明條件 – Yared

+0

答案是否定的。在WHERE子句中使用'AND' /'OR'。 – jarlh

回答

0

嘗試此查詢(用MS T-SQL)

WITH CTE 
      AS (SELECT xx.DATE , 
         xx.TRANSACTION_ID , 
         xx.ID , 
         xx.CODE 
       FROM  TABLE_X xx 
       WHERE xx.DATE >= '2015-01-01' 
         AND xx.ID IN (SELECT yy.id 
             FROM  TABLE_Y yy 
             WHERE yy.status = 'OPEN' 
               AND yy.type = 1) 
      ) 
    SELECT * 
    FROM CTE 
    UNION 
    SELECT xx.* 
    FROM TABLE_X xx 
      JOIN CTE ON xx.Transaction_ID = CTE.Transaction_ID - 10 
         AND CTE.Code = 'RED' 
    UNION 
    SELECT xx.* 
    FROM TABLE_X xx 
      JOIN CTE ON xx.Transaction_ID = CTE.Transaction_ID + 10 
         AND CTE.Code = 'GREEN' 
    ORDER BY Date , 
      ID; 

如果我理解您的要求正確,那麼最後一行以上查詢將提供

enter image description here

+0

問題被標記爲'mySQL'而不是'sql-server'例如mySQL不支持CTE。 – onedaywhen

0

輸出ID='CAT'1/4/2015,4020,CAT,RED)不應該在您的最終輸出中。您在ex.output的任何地方都沒有得到4020的計算TRANSACTION_ID

我將建立這樣的查詢:

SELECT 
xx.DATE, 
xx.TRANSACTION_ID, 
xx.ID, 
xx.CODE 
FROM TABLE_X xx 
WHERE TRANSACTION_ID IN 
(SELECT CASE eo.CODE WHEN 'RED' THEN TRANSACTION_ID-10 WHEN 'GREEN' THEN TRANSACTION_ID+10 ELSE TRANSACTION_ID END as trx_id 
FROM ex.output eo)