【问题标题】:Compatibility regexp_replace() postgres and h2兼容性 regexp_replace() postgres 和 h2
【发布时间】:2019-06-10 08:29:39
【问题描述】:

我们有 Spring Boot 应用程序和 Postgres 中的原生 sql

Select .... 
where regexp_replace(LOWER(company_name), '\s', '', 'g') = regexp_replace(LOWER(:suspect), '\s', '', 'g')

并且有测试 H2 数据库,其中不支持 regexp_replace flag 'g'

【问题讨论】:

    标签: postgresql spring-boot h2 spring-test


    【解决方案1】:

    我不确定在 H2 的情况下您是否需要 g 标志,因为所有匹配项的全局替换似乎是默认设置。来自documentation

    替换与正则表达式匹配的每个子字符串。有关详细信息,请参阅 Java String.replaceAll() 方法。如果任何参数为 null(可选 flagsString 参数除外),则结果为 null。

    我假设 H2 的 REGEXP_REPLACE 正在由 Java String#replaceAll 在后台实现。在这种情况下,所有匹配的子字符串都会被自动替换。

    关于两个不同数据库的问题,您确实应该尝试使用相同的数据库进行测试和生产。如果可能失败,您可能希望坚持使用 ANSI SQL。

    【讨论】:

    • 但他们无法删除'g' 参数。它会使测试成功,但在生产中失败(因为 Postgres 只会替换第一次出现)。另一个很好的例子说明为什么使用不同的 DBMS 进行测试和生产并不是一个好主意
    • @a_horse_with_no_name 我错过了那部分。当然,如果不使用 ANSI SQL,则无法保证任何代码都会移植到另一个数据库。
    • 是的,我阅读了文档 h2 和 postgress,也许真正在春季测试中替换 sql?
    • 这个问题是你现在维护两个不同的数据库代码库。最好在任何地方都使用同一个数据库。
    猜你喜欢
    • 2014-07-19
    • 2023-03-21
    • 2013-12-11
    • 2014-07-28
    • 2018-03-03
    • 2019-11-04
    • 2011-09-01
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多