【问题标题】:PreparedStatement IN clause Regexp alternative?PreparedStatement IN子句Regexp替代?
【发布时间】: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

【问题讨论】:

    标签: java mysql regex jdbc prepared-statement


    【解决方案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)$'
      

      【讨论】:

        猜你喜欢
        • 2018-03-08
        相关资源
        最近更新 更多