PreparedStatement IN子句Regexp替代?

问题描述 投票:0回答:1

我遇到了和这个问题的作者一样的问题(PreparedStatement IN子句备选?),不知道是否使用mysql的 REGEXP 将是一个优雅的方式来获得相同的功能的 IN 而只用一个 PreparedStatement 为不同数量的值进行匹配?这里有一些SQL的例子来说明我在说什么。

SELECT first_name, last_name 
FROM people
WHERE first_name REGEXP ?

可以用一个字符串提供多个值,比如 "Robert|Janice|Michael". 我没看到 REGEXP 的帖子中提到的任何地方。

java mysql regex jdbc prepared-statement
1个回答
0
投票

从技术上讲,是的,它是一种替代方案。

然而,请注意,使用regex进行匹配的效率要比使用 in 操作符;它给数据库带来了更多的工作,因为数据库需要初始化regex引擎,并针对每一个值运行它(它不能利用索引)。所以我不建议将其作为一般的解决方案:相反,只要在你的应用程序中多写几行代码就可以正确使用 in 操作符,并且只在真正需要的地方使用regexes。

旁白:如果你想匹配整个字符串,如 in 你需要在值的列表周围加上 ^$因此,相当于:

first_name in ('Robert', 'Janice', 'Michael')

将是:

first name regexp '^(Robert|Janice|Michael)$'

0
投票

另一种方法。

FIND_IN_SET(name, 'Robert,Janice,Michael')

是的,可以用它来代替 但它必须是一个所需值的通项。 这也适用于 FIND_IN_SET(foo, '1,123,45'). 注意到 12 将不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.