2017-10-19 85 views
0

我有以下情形設置一個變量中case語句在MySQL

SELECT 
... 
... 
(
    @var1 = MAX(IF(table1.name='Mod', table1.value, NULL)) 
    @var2 = MAX(IF(table1.name='Man', table1.value, NULL)) 
    CASE 
     WHEN @var1 IS NOT NULL && @var2 IS NOT NULL THEN @var1+"/"[email protected] 
     WHEN @var1 IS NULL && @var2 IS NOT NULL THEN @var2 
     WHEN @var1 IS NOT NULL && @var2 IS NULL THEN @var1 
     ELSE NULL 
END) AS "col44", 

這是我拋出一個異常在MySQL控制檯。

我們不能在通用mysql select查詢中做變量賦值嗎?

+2

什麼是例外? – Moseleyi

+0

你的SQL語法有錯誤;檢查與你的MySQL服務器版本相對應的手冊,在'@ var2 = MAX(IF(table1.name ='Man',table1.value,NULL)''附近使用正確的語法') – user2133404

+0

最後的逗號怎麼樣每個變量表達式?是一個錯字? (我不能確定沒有看到整個'SELECT') – Moseleyi

回答

1

這是怎麼回事?

SELECT ... 
    , @var1 = MAX(IF(table1.name='Mod', table1.value, NULL)) 
    , @var2 = MAX(IF(table1.name='Man', table1.value, NULL)) 
    , CASE 
     WHEN @var1 IS NOT NULL && @var2 IS NOT NULL THEN @var1+"/"[email protected] 
     WHEN @var1 IS NULL && @var2 IS NOT NULL THEN @var2 
     WHEN @var1 IS NOT NULL && @var2 IS NULL THEN @var1 
     ELSE NULL 
    END AS "col44" 

請注意添加逗號和刪除括號。


或者,您可以使用子查詢。 (根據我的經驗,查詢中的變量與聚合結合使用時會變得不可預測;這可以避免所有變量)。

SELECT ... 
     , CASE 
      WHEN modMax IS NOT NULL && manMax IS NOT NULL THEN modMax+"/"+manMax 
      WHEN modMax IS NULL && manMax IS NOT NULL THEN manMax 
      WHEN modMax IS NOT NULL && manMax IS NULL THEN modMax 
      ELSE NULL 
     END AS "col44" 
    FROM (
     SELECT ... 
      , MAX(IF(table1.name='Mod', table1.value, NULL)) AS modMax 
      , MAX(IF(table1.name='Man', table1.value, NULL)) AS manMax 
     ... 
    ) AS subQ 

備註:提防modMax+"/"+manMax;它最終會給你一個從modMax + 0 + manMax計算出來的整數,而不是一個字符串。

+0

謝謝。 第一種方法正在工作,但是它將@ var1,@ var2作爲列追加到不需要的結果 – user2133404

+0

只更新了第二種方法以避免在結果中包含這些列;更改第一個查詢以省略它們的唯一方法是基本上使其與第二個查詢非常相似,以至於您可以使用第二個查詢。 – Uueerdo