2014-09-11 32 views
0

設置我想對在MySQL案例與結果在mysql中

SELECT result.* FROM 
(CASE WHEN (2 = 2) 
THEN 
(SELECT * FROM mytable WHERE myID =2814) 
END) result ; 

測試下面的查詢,但它正在發送語法錯誤。 任何想法它有什麼問題嗎?

+1

你到底想達到什麼目的? – Mureinik 2014-09-11 12:49:07

+0

你想要做什麼?上面的查詢不需要case語句。 – 2014-09-11 12:50:40

+0

我會做的是在不同的情況下,我會返回不同的表中不同的結果集。 首先,我只是想測試我是否可以返回基於大小寫的結果集。 – 2014-09-11 12:52:33

回答

0

,你可以做一個四圍的方式,像這樣

SET @query := NULL; 

SELECT @query := t.qry 
FROM 
( SELECT 
     CASE WHEN 2 = 2 
      THEN "SELECT * FROM mytable WHERE myID =2814" 
      WHEN another_condition 
      THEN "another_select" 
     END as qry 
) t ; 

PREPARE query1 FROM @query; 
EXECUTE query1; 
0

這是一個評論太長。

顯然,你的查詢等效於:

SELECT * 
FROM mytable 
WHERE myID = 2814; 

這使得它有點難以找出你所要求的。

基本上,儘管case是一個表達式,並且from子句不接受表達式。它接受表名,視圖名稱,子查詢等。其次,case聲明還有其他一些問題。

  • 它返回一個標量標量值。子查詢可能會返回多行。
  • 返回多個列是不允許
  • 所有條款需要返回同樣的事情

如果你想從多個表中選擇 - 和他們都具有相同的結構 - 你可以使用union all結構:

select t.* 
from table2 t 
where . . . 
union all 
select t.* 
from table2 t 
where . . . 
+0

這只是一個示例,我的真實查詢在不同情況下會有所不同 – 2014-09-11 13:10:41

+0

@KamranShahid。 。 。也許你應該提出另一個問題,提供足夠的細節來提供一個有用的答案(除非John提供的動態SQL爲你工作)。不要編輯這個問題 - 對我們這些以當前形式回答它的人來說是不公平的。 – 2014-09-11 14:05:46

0

我寧願每次(其中至少將使MySQL的使用索引正確的一些機會)使用不同的查詢。

但是假設有,你作爲根據檢查數據源那麼也許是這樣想幾個子查詢: -

SELECT result.* 
FROM 
(
    SELECT * FROM mytable WHERE 2 = 2 AND myID = 2814 
    UNION 
    SELECT * FROM mytable2 WHERE 1 = 2 AND myID = 2814 
    UNION 
    SELECT * FROM mytable3 WHERE 3 = 2 AND myID = 2814 
) result ; 
+0

這個問題看起來像OP只想執行一個特定的查詢,這可能會導致運行時問題 – 2014-09-12 02:30:16

+0

完全同意,但這就是你會動態地建立SQL來做。這個解決方案將以他目前想要的方式工作,並且考慮到大多數聯合查詢將帶回任何應該相對高效的東西。下方是子查詢的結果使用的任何where子句將不會使用任何索引。 – Kickstart 2014-09-12 08:04:23