2011-11-11 33 views
1

這裏是我的代碼:在工會內的情況?

SELECT 'Add or remove a keyword' AS 'Keyword', '1' AS 'row number' 
UNION 
SELECT '---------------------', '2' 
UNION 
SELECT 
    CASE 
    WHEN @list_item = 'duration' 
    THEN (SELECT duration FROM durationTable) 
    END 
    CASE 
    WHEN @list_item = 'location' 
    THEN (SELECT location FROM locationTable) 
    END 
, '3' 
ORDER BY 2 

麻煩的是,這個看時間和地點選擇的子查詢和子查詢僅限於一個結果,而且,我似乎無法找出正確的語法將我的CASE上升到一個級別,以便查詢不是子查詢。

有沒有一種方法可以保留union/select允許的結構,同時還可以更改查詢哪個表的最後一位,還可以檢索整個表列而不是一個結果?

任何提示?非常感謝您參觀!

回答

0

這不是很漂亮,但我認爲這應該工作:

SELECT 'Add or remove a keyword' AS 'Keyword', '1' AS 'row number' 
UNION 
SELECT '---------------------', '2' 
UNION 
SELECT duration, '3' FROM durationTable WHERE 1 = (SELECT CASE WHEN @list_item = 'duration' THEN 1 ELSE 0 END) 
UNION 
SELECT location, '3' FROM locationTable WHERE 1 = (SELECT CASE WHEN @list_item = 'location' THEN 1 ELSE 0 END) 
+0

爲什麼您使用'CASE'而不僅僅是'WHERE'子句? – JNK

+0

@JNK,你是對的,我應該只使用一個簡單的WHERE子句,而不是用CASE複雜化它。我已經提出了你的答案,因爲它是更好的解決方案。 – PaulStock

2

首先,你應該知道這是一個糟糕的設計。你正在混淆你的表示層和你的數據層,這將導致問題的發展。

但是,如果你是絕對致力於這樣做,你可以使用一個額外的SELECT做到這一點:

... 
UNION 

SELECT duration FROM durationTable, '3' 
WHERE @list_item = 'duration' 

UNION 

SELECT location FROM locationTable, '3' 
WHERE @list_item = 'location' 
... 

不匹配的查詢將返回一個空的結果集和被忽略。

0
SELECT 'Add or remove a keyword' AS 'Keyword', '1' AS 'row number' 
UNION 
SELECT '---------------------', '2' 
UNION 
SELECT duration,3 FROM durationTable WHERE @list_item = 'duration' 
UNION 
SELECT location,3 FROM locationTable WHERE @list_item = 'location' 
相關問題