2011-05-10 156 views
1

我注意到一些奇怪的關於用戶定義的變量:古怪的行爲

可以說我有這個表:

num_table 
+---------+ 
| numbers | 
| 3 | 
| 6 | 
| 9 | 
+---------+ 

我可以創建一個逗號分隔的列表並將其存儲在一個用戶定義的變量,像這樣:

SELECT @var := GROUP_CONCAT `numbers` from num_table; 

這將值3,6,9分配給@var

這裏是奇怪的部分。運行

SELECT 3 IN (@var) 

返回1,但運行

SELECT 6 IN (@var) 

返回0

在我看來,它應該工作或不工作。任何想法爲什麼它只適用於列表中的第一個數字?

+3

我會想象它將'3,6,9'轉換爲數字,最終忽略了第一個非數字字符以後的任何內容,因此最終以3結尾。 – 2011-05-10 15:59:50

回答

2

不能使用IN()具有可變和有變量作爲列表處理 - 只有實際列表(也許是變量),可以使用 - 即IN (1, 2, 3)IN (@var1, @var2, @var3)

如果@var包含「3也應該工作, 6,9' - 所以我懷疑@var包含'3',但是 - 你能驗證它的內容嗎?

馬丁可能將要發生什麼與鑄造 - 我敢打賭'3' IN (@var)返回任何

+0

OK @Martin似乎是正確的。我可以驗證@var確實包含列表,因爲'SELECT @var LIKE'%6%''retunrs'1'。 – jisaacstone 2011-05-10 16:27:32

1

你不能用一個字符串變量使用IN() - 但你可以使用FIND_IN_SET()來代替,該服務正是爲此目的:

SELECT FIND_IN_SET(6, @var) 

返回2 - 第二位置

SELECT FIND_IN_SET(7, @var) 

返回NULL - 無匹配