iT邦幫忙

1

[MYSQL] 一道簡易的 CASE 語法測試,發現回傳結果本身就有異常?

各位好,小弟我又來詢問令人無解的問題了~
底下為我此次所測試的 CASE 查詢語法:

SELECT
   CASE
      WHEN 1=1 THEN 1
      ELSE 'NAN'
   END AS aaa,
   CASE
      WHEN 1=1 THEN 2
      ELSE 'NAN'
   END AS bbb,
   CASE
      WHEN 1=1 THEN 3
      ELSE 'NAN'
   END AS ccc,
   CASE
      WHEN 1=1 THEN 123
      ELSE 'NAN'
   END AS ddd,
   CASE
      WHEN 1=0 THEN 123
      ELSE 'NAN'
   END AS eee  

執行的結果如下圖所示~
每一個數值之間,其前面都會被強制加了一個「3」?!
有哪位大神知道這是為什麼嗎???
查詢結果

尼克 iT邦高手 1 級 ‧ 2018-02-12 16:02:28 檢舉
WHEN 1=1 有多個同樣條件判斷?你想表達的是?
ccutmis iT邦研究生 5 級 ‧ 2018-02-12 17:26:25 檢舉
因為你的DBMS預設編碼不是utf8 輸出結果正確只不過是以ascii碼呈現 棉花君正解...
http://www.web3d.url.tw/d3/sql_select_case.gif
keberosx iT邦新手 5 級 ‧ 2018-02-13 08:26:22 檢舉
To 尼克:只是為了強制讓那條規則強制為 True,藉以獲得後面的數字
To ccutmis:沒錯…棉花君正解…。我從來沒想過 MySQL 竟然回傳的是 ASCII Code…。
5
棉花
iT邦新手 4 級 ‧ 2018-02-12 16:41:33
最佳解答

因為你的SQL寫法有問題
輸出的數值並不是數字,而是HEX值
去查ASCII table就能發現:

HEX 字串
31 1
32 2
33 3
41 A
4e N

所以123會顯示成313233、NAN顯示成4e414e

正確的寫法應該是要讓輸出的型別一致,才不會發生型別自動轉換與預期不同的問題

SELECT
   CASE
      WHEN 1=1 THEN '1'
      ELSE 'NAN'
   END AS aaa,
   CASE
      WHEN 1=1 THEN '2'
      ELSE 'NAN'
   END AS bbb,
   CASE
      WHEN 1=1 THEN '3'
      ELSE 'NAN'
   END AS ccc,
   CASE
      WHEN 1=1 THEN '123'
      ELSE 'NAN'
   END AS ddd,
   CASE
      WHEN 1=0 THEN '123'
      ELSE 'NAN'
   END AS eee  

另外,你寫NAN應該是指js中的NaN(Not a Number)
很遺憾,SQL中並沒有NaN

所以要嘛就一律輸出字串,不然就是NaN時回傳一個絕對不會出現在其他選項的數值(ex. 0、-1之類的)

linusin iT邦新手 5 級 ‧ 2018-02-12 17:48:14 檢舉

正解

ccutmis iT邦研究生 5 級 ‧ 2018-02-12 17:51:13 檢舉

/images/emoticon/emoticon12.gif

keberosx iT邦新手 5 級 ‧ 2018-02-13 08:35:18 檢舉

經實驗證明!正解!

我嘗試將 ELSE 'NAN' 改為 ELSE '0' 後,查詢結果就不是 ASCII Code了,而是正常的數值 1、2、3、123~

也就是說在 SQL 的設計上,同一欄位的回傳結果若是可能同時有數值或字串時,就會造成 MySQL 進行這種非期望性的回傳。

/images/emoticon/emoticon12.gif

1
gn00044255
iT邦新手 5 級 ‧ 2018-02-12 16:05:13

then後面,一個是數字格式,一個是文字,有點奇怪

keberosx iT邦新手 5 級 ‧ 2018-02-13 08:30:33 檢舉

唔…這問題很好…。其實這關係到上級所要看的資料…
若是查詢的結果為 Null 的話,上級主管不想看到所謂的空值。而必須轉換為 "NAN" 這個字串出來讓他們看。

棉花 iT邦新手 4 級 ‧ 2018-02-13 08:37:50 檢舉

如果上級不是直接對DB下指令的話,其實NULL值轉換可以交給程式處理

不然就是像上面說的一律轉字串

keberosx iT邦新手 5 級 ‧ 2018-02-13 09:59:58 檢舉

To 棉花:嗯~已照您所提到的方向進行處理~

0
fuzzylee1688
iT邦新手 4 級 ‧ 2018-02-13 08:49:59

這個問題是要證明MYSQL容錯力很強哦?

keberosx iT邦新手 5 級 ‧ 2018-02-13 09:58:25 檢舉

參與程式設計過的同仁們應該都知道:非期望性的錯誤,總是來自於非期望性的操作。

所以總體而言,這的確是屬於 MySQL 一種容錯上的設計,因為「簡易的數字」和「英文字母」皆是可利用 ASCII Code 來表示的一種方式~

但老實說,關於此次的教訓,我反倒是希望 MySQL 可以丟出一個錯誤或警訊,要求使用者統一欄位資料格式……

註:這問題其實要證明「上級主管總是有些異想天開的作法,導致資訊人員得面臨一些奇妙的問題」(噓…心照不宣!)

我要發表回答

立即登入回答