2017-01-03 89 views
0

我有一個查詢,它由3個查詢組成。 根據一個查詢的結果,我想運行其他兩個查詢中的任何一個。選擇在單個MySQL查詢中的多個查詢中運行哪個查詢

SELECT 

CASE type 


    WHEN 'H' 
    THEN (select count(*) from tableN where hid = 228) 

    when 'S' 
    THEN ( select cid,cname from tableC where cid = (select hid from tableN where sid = 228) ) 


END 

FROM tableC WHERE cid=228; 

但由於查詢一個只返回1列即COUNT(*),而其他查詢返回兩列,即CID和CNAME,我收到以下錯誤:

操作數應包含1列(S)

如何修改我的查詢,以便-----

當類型是「H」,下面的查詢運行:

select count(*) from tableN where hid = 228 

,當類型爲「S」,下面的查詢運行:

select cid,cname from tableC where cid = (select hid from tableN where sid = 228) 
+0

SQL查詢的結果集中的列是固定的。記住這一點,編輯你的問題提供樣本數據和預期結果。 –

+0

我沒有看到你用另一個查詢包裝不同的查詢,然後用'type'變量在它們之間進行選擇的可能值。它只會讓你感到困難。也許你應該在這裏重新考慮你的方法。 –

回答

0

你需要解決這個問題之前,需要考慮幾件事情。

  1. 主查詢的SELECT部分​​中的子查詢必須始終返回單行,單列。
  2. 查詢輸出應始終給出一致的編號。作爲輸出的列。

例如:

錯誤:select col1, (select col2, col3 from...) , col 4 from table 1

Coreect:select col1, (select col2 from..), (select col3 from..), col4 from table 1

考慮到這2個約束,你的問題的解決方案可能是

SELECT col1, col2 FROM 
    (
    SELECT COUNT(*) AS col1, null AS col2, 'H' AS colType from tableN 
    UNION ALL 
    SELECT CID AS col1, CNAME AS col2, 'S' AS colType FROM tableC where ..... 
) 
where colType = :input_type 

現在取決於input_type價值查詢1的結果被選中或qu選擇2。 注意:

  • 查詢1將有一個虛擬列以匹配任何行。
  • input_type是基於'H'或'S'的變量由您提供
  • 查詢2不完整,因爲我想顯示結構,而不是花時間在完整的細節上。
  • 此外,即使您只想要1個查詢的結果,該查詢也有執行這兩個查詢的風險。
  • 建議將選擇執行哪個查詢的邏輯移至過程塊或應用程序層。使用SQL來決定在運行時執行哪個查詢並不是一個好設計。應用程序層邏輯是正確的地方(假設有一些其他程序調用此查詢,您應該考慮將此邏輯存在)