2016-10-12 155 views
3

我創建了一個(復)子查詢,我把結果在一個變量類似數值:分流/ mysql的爆炸字符串中

@mylist := (select ....) 

返回的值是一個逗號delimeted串..因爲在子查詢中我也使用了concat(),所以這個值是一個字符串。

在同一個SQL我想在像另一個子查詢中使用這個變量:

where table.mycolumn IN (@mylist) 

的問題是,由於@mylist是一個字符串Mysql的讀取查詢爲:

where table.mycolumn IN('575030,655156,655157') 

而我希望它被執行爲

where table.mycolumn IN(575030,655156,655157) 

如何將字符串轉換爲(數字)ar射線?

PS:我使用的MySQL 5.1

回答

3

您可以使用(在您指定的MySQL版本it is available)功能FIND_IN_SET。它將該提供的字符串(在你的情況下存儲在變量),使用逗號作爲分離器和(如果沒有找到0)返回指定值的第一次出現的索引的索引

/* building the list */ 
> SELECT @mylist :=GROUP_CONCAT(id SEPARATOR ',') FROM users WHERE id < 10; 
+-----------------------------------------+ 
| @mylist:=group_concat(id separator ',') | 
+-----------------------------------------+ 
| 0,2,3,4,5,6,7,8,9      | 
+-----------------------------------------+ 

> SELECT id, mail FROM users WHERE FIND_IN_SET(id, @mylist); 

自動澆鑄足以自動管理大多數情況下原始類型和最終字符串之間的比較。


UPDATE

雖然回答你的問題,尋找大量的IDS時所提出的解決方案可以很慢。一種更好的解決方案是放棄使用變量並將結果存儲在臨時表中

CREATE [TEMPORARY] TABLE IF NOT EXISTS tmp_users (
    "id" INT, 
    PRIMARY KEY (id) 
) 

INSERT INTO tmp_users (...); 
+0

無論@mylist中的分隔符是什麼,它都可以工作嗎? – MontyPython

+1

不,根據文檔沒有參數來更改分隔符。雖然可以添加一個'FIND_IN_SET(id,REPLACE(@mylist,'my_separator',','))',但如果提取的值可以包含逗號,它將不起作用。 – Batsu

+1

謝謝你解決了我的問題! :-) – user2022678