2014-10-20 22 views
4

我有以下SQL查詢:使用查詢

SELECT id_zam AS test, 
    CASE WHEN (SELECT something FROM sth WHERE id_something = test) = 1 
      THEN 
       'true' 
      ELSE 
       'false' 
    END as test_result 
FROM testTable 

something等於1所以CASE語句是true,所以它要執行THEN說法是'true'

但是,當我周圍的別名test加單引號是這樣的:

SELECT id_zam AS 'test', 
    CASE WHEN (SELECT something FROM sth WHERE id_something = 'test') = 1 
      THEN 
       'true' 
      ELSE 
       'false' 
    END as test_result 
FROM testTable 

查詢返回'false'。任何人都可以解釋他們爲什麼不同?

+2

「測試」是一個字符串,測試一個記錄 - 列名。 – 2014-10-20 16:06:23

+3

單引號應該只用於定義字符串和日期常量。沒有引號,'test'是指一列;用引號「test」是字符串「test」。 – 2014-10-20 16:06:23

+1

看起來你正在將撇號與後退標記混淆(在鍵盤上的「1」的左側)。在mysql中使用後面的tick表示列名,撇號用於表示一個字符串。 – paqogomez 2014-10-20 16:09:53

回答

3

單引號(或撇號,如果您願意)用於表示字符串(有時是日期),但不是整數值。

我假設你的id_something是一個整數變量。如果是這樣的話,問題在於你試圖將一個整數與一個字符串進行比較,該字符串總是返回false。

在第一個示例中,您選擇了一個整數併爲其提供別名test。當你做比較時,你會比較兩個有效的整數。但是,一旦將其更改爲'test',則您現在有一個字符串,與id_zam沒有任何關係。當你完成一個整數和一個字符串的比較時,它默認返回false。

編輯 對於別名,這是正確的,但不一定總是如此。在這個例子中,是的,test是一個別名,而'test'是一個字符串文字,所以它們將被區別對待。但是,通過MySQL默認值,單引號不會影響其他項目的比較。例如,如果您有條件爲1 = '1'的查詢,則返回true。有關其他解釋,請參閱此答案的評論。

要重新強調和簡化,如果要使用別名比較某些內容,請不要使用單引號。

+0

除非你有嚴格的模式啓用,否則mysql不會在乎'42''v.s. '42'。它會根據情況進行轉換。 – 2014-10-20 16:22:09

+0

*「...您正在嘗試將整數與字符串進行比較,該字符串將始終返回false。」*不一定。在默認安裝中,'1 ='1''將始終返回true。 – 2014-10-20 16:23:33

+0

雖然這不適用於別名,是嗎?我可以相應地編輯答案。 – AdamMc331 2014-10-20 16:24:19

-1

你得到假的,因爲這樣子查詢:

SELECT something FROM sth WHERE id_something = 'test' 

不返回等於1

+1

對不起我的壞。我編輯了我的問題。我的意思是「某事」等於1 – XardasLord 2014-10-20 16:07:26

+0

這並不一定是錯誤的。它沒有返回記錄的原因是因爲比較不正確,這是OP兩個例子之間的差異。 – AdamMc331 2014-10-20 16:10:10