我遇到了和这个问题的作者一样的问题(PreparedStatement IN子句备选?),不知道是否使用mysql的 REGEXP
将是一个优雅的方式来获得相同的功能的 IN
而只用一个 PreparedStatement
为不同数量的值进行匹配?这里有一些SQL的例子来说明我在说什么。
SELECT first_name, last_name
FROM people
WHERE first_name REGEXP ?
可以用一个字符串提供多个值,比如 "Robert|Janice|Michael"
. 我没看到 REGEXP
的帖子中提到的任何地方。
从技术上讲,是的,它是一种替代方案。
然而,请注意,使用regex进行匹配的效率要比使用 in
操作符;它给数据库带来了更多的工作,因为数据库需要初始化regex引擎,并针对每一个值运行它(它不能利用索引)。所以我不建议将其作为一般的解决方案:相反,只要在你的应用程序中多写几行代码就可以正确使用 in
操作符,并且只在真正需要的地方使用regexes。
旁白:如果你想匹配整个字符串,如 in
你需要在值的列表周围加上 ^
和 $
因此,相当于:
first_name in ('Robert', 'Janice', 'Michael')
将是:
first name regexp '^(Robert|Janice|Michael)$'
另一种方法。
FIND_IN_SET(name, 'Robert,Janice,Michael')
是的,可以用它来代替 但它必须是一个所需值的通项。 这也适用于 FIND_IN_SET(foo, '1,123,45')
. 注意到 12
将不匹配。