MySQL:在“WHERE <column_name> IN <values>”查询</values> </column_name>中使用字符串

时间:2012-04-10 08:11:29

标签: mysql string

亲爱的Stackoverflow成员,

我希望我不会忽略一些显而易见的事情,但到目前为止我还没能找到解决问题的方法。

我需要使用标准WHERE ... IN ( 1, 2, 3, 4 )子句从表中获取某些列值。 但问题是WHERE子句中的值必须基于存储在另一个表的列中的值动态构建,看起来像'a:3:{i:0;s:3:"153";i:1;s:3:"211";i:2;s:3:"226";}'。在该示例中,要提取的值是153,211和226,从而产生条款WHERE <column> IN ( 153, 211, 226 )。此字符串的格式始终相同,但值的数量可能会有所不同。

我可以使用一些带有

的RegExp技巧从这个字符串中获取实际值
SELECT value from `column` WHERE <non-scary WHERE clause> INTO @valueString;
SET @IDs =  CONVERT(PREG_REPLACE('/[^\"]+\"([^\"]+)\".*/', '$1', PREG_REPLACE( '/\"\;[^\"]+\"/', '\,\ ', @valueString  )) USING UTF8);

函数PREG_REPLACE是来自[http://www.mysqludf.org/lib_mysqludf_preg/]的UDF,这是人们一直在寻找RegExp / Replace函数时通常推荐的函数。 CONVERT()就在那里,因为PREG_REPLACE给了我一个blob,而不是一个可读的字符串。

运行这些查询后,运行

SELECT @IDs;

给我一​​个值列表,看起来像(在这个例子中)153, 211, 226

现在的问题是,我如何说服MySQL在WHERE ... IN子句中使用这些值。天真的查询

SELECT * FROM `table` WHERE id IN  ( SELECT @IDs );   

不会这样抱怨,但只返回列表中第一个值的结果,忽略其他值(我必须承认,我不明白为什么会这样做)。

很明显,这在Ruby,Python,Perl等中都是微不足道的,但由于技术原因,它必须在SQL中严格完成。同事给我的一个建议是使用临时表来编写中间结果,但我不确定我是否看到它是如何实现和/或工作的。而且,如果没有很多循环,子串和其他丑陋的话,我认为不能轻易完成,但我有待纠正。

我希望对我的问题的描述或多或少是清楚的。我很欣赏任何见解,想法和提示。

提前感谢您的时间和精神,Constantijn Blondel,Leipzig DE

1 个答案:

答案 0 :(得分:0)

在你的where子句中选择一个可以正常工作的子查询。