PreparedStatement IN子句Regexp替代?

Posted

技术标签:

【中文标题】PreparedStatement IN子句Regexp替代?【英文标题】:PreparedStatement IN clause Regexp alternative? 【发布时间】:2020-08-27 09:34:49 【问题描述】:

我遇到了与这个问题的作者 (PreparedStatement IN clause alternatives?) 相同的问题,并且想知道使用 mysqlREGEXP 是否会是一种优雅的方式来获得与 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替代?的主要内容,如果未能解决你的问题,请参考以下文章

IN子句效率中的preparedstatement设置值

如何使用 WHERE x IN 子句为 PreparedStatement 编写 SQL?

PreparedStatement 没有?在 where 子句中

PreparedStatement 可以不考虑 WHERE 子句中的某些条件吗?

使用 try-with-resources 或在“finally”子句中关闭此“PreparedStatement”。在 Spring JDBC [重复]

在preparedStatement中使用可变数量的参数