PreparedStatement IN子句Regexp替代?
Posted
技术标签:
【中文标题】PreparedStatement IN子句Regexp替代?【英文标题】:PreparedStatement IN clause Regexp alternative? 【发布时间】:2020-08-27 09:34:49 【问题描述】:我遇到了与这个问题的作者 (PreparedStatement IN clause alternatives?) 相同的问题,并且想知道使用 mysql 的 REGEXP
是否会是一种优雅的方式来获得与 IN
相同的功能,而只使用一个 PreparedStatement
匹配不同数量的值?这里有一些示例 SQL 来说明我在说什么:
SELECT first_name, last_name
FROM people
WHERE first_name REGEXP ?
可以使用类似"Robert|Janice|Michael"
的字符串提供多个值。我没有在该帖子的任何地方看到REGEXP
。
【问题讨论】:
【参考方案1】:另一种方法:
FIND_IN_SET(name, 'Robert,Janice,Michael')
是的,可以替换。但它必须是所需值的 commalist。这也适用于FIND_IN_SET(foo, '1,123,45')
。请注意,12
将不匹配。
【讨论】:
【参考方案2】:从技术上讲,是的,它是一种替代方案。
但是请注意,使用正则表达式进行匹配的效率低于in
运算符;它会为数据库带来更多的工作,需要初始化正则表达式引擎,并针对每个值运行它(它不能利用索引)。您可能不会在小容量上注意到它,但随着数据的增长,这可能会成为一个问题。因此,我不建议将其作为通用解决方案:相反,只需在应用程序中编写更多代码行以正确使用 in
运算符,并仅在真正需要的地方使用正则表达式。
另外:如果你想匹配整个字符串,就像in
一样,你需要用^
和$
包围值列表,所以相当于:
first_name in ('Robert', 'Janice', 'Michael')
应该是:
first name regexp '^(Robert|Janice|Michael)$'
【讨论】:
以上是关于PreparedStatement IN子句Regexp替代?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 WHERE x IN 子句为 PreparedStatement 编写 SQL?
PreparedStatement 没有?在 where 子句中
PreparedStatement 可以不考虑 WHERE 子句中的某些条件吗?
使用 try-with-resources 或在“finally”子句中关闭此“PreparedStatement”。在 Spring JDBC [重复]