2014-09-25 37 views
0

例如我有一個表名爲TABLE並且它具有命名FIELD與值和的單個字段。運行此語句用戶定義會話變量()函數返回意想不到的結果

SELECT GROUP_CONCAT(`FIELD`) 
INTO @LIST 
FROM `TABLE`; 

SELECT @LIST; 

回報

1,2

然後我做一個IF()聲明

SELECT IF (1 IN(@LIST),"TRUE","FALSE"); 

回報

TRUE

當我運行這個

SELECT IF (2 IN(@LIST),"TRUE","FALSE"); 

返回

FALSE

讓我試試這個聲明一點點調試

SELECT IF (2 IN(1,2),"TRUE","FALSE"); 

,並返回我的預期值

TRUE

那麼,有沒有東西,我錯過了什麼?我需要它返回TRUE

+1

在你的語句,'@ LIST'實際上相當於一個字符串文字''1, 2''。但是它正在數值上下文中進行評估,MySQL正在評估它等於整數'1'。 (嘗試'SELECT @ LIST + 0'和'SELECT @ LIST + 4',看看返回的是什麼,所以,你的謂詞有效地是'SELECT 1 IN(1)'。在單引號中,'SELECT'1'IN '1,2')'結果將會有所不同**底線:**字符串內的**逗號**(不管字面量還是udv)是**不會被解釋爲SQL文本的一部分。你可以在字符串文字或udv上使用字符串比較函數,例如'FIND_IN_SET' – spencer7593 2014-09-25 03:48:26

回答

1

變量@LIST有一個字符串類型值:'1,2'。爲了測試值在此值列出你必須使用字符串函數:FIND_IN_SET

SELECT IF (FIND_IN_SET(1, @LIST), "TRUE","FALSE"); 
SELECT IF (FIND_IN_SET(2, @LIST), "TRUE","FALSE"); 

測試在這裏:http://sqlfiddle.com/#!2/4fce1d/1

+2

整潔的解決方案很重要的一點是,IN不需要以逗號分隔的字符串作爲輸入,而是以逗號分隔的列表作爲輸入。 – Namphibian 2014-09-25 03:43:21

0

在聲明中尋找逗號分隔的值,可以是字符串,整數,雙打和浮動等等。你可以在大多數數據類型中使用in語句。什麼樣的數據類型是@LIST?一個varchar?您的@LIST是一個如下所示的字符串:'1,2'而不是逗號分隔值列表,如1,2。細微但非常重要的區別。就像你在上面嘗試一樣,你不能使用IN語句。

但是,如果你創建查詢作爲一個字符串,然後執行該字符串作爲動態SQL我打賭它會工作。

所以請嘗試以下操作:

SELECT GROUP_CONCAT(`FIELD`) 
INTO @LIST 
FROM `TABLE`; 

SET @s = CONCAT('SELECT IF (2 IN(',@LIST,'),"TRUE","FALSE");'); 

PREPARE stmt1 FROM @s; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

去閱讀有關動態SQL。