You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liquibase Update添加LIKE子句失效,是否需改用原生SQL?

Liquibase Update中LIKE子句失效的问题解决

你的代码存在两个核心问题导致无法正常执行,先修正这些问题再考虑是否切换到原生SQL:

1. 保留关键字未转义

from和to是SQL的保留关键字,直接作为列名使用会触发语法错误。需要根据你的数据库类型对列名进行转义:

  • MySQL/MariaDB:用反引号包裹,例如 `from`、`to`
  • PostgreSQL/Oracle:用双引号包裹,例如 "from"、"to"
  • SQL Server:用方括号包裹,例如 [from]、[to]

2. LIKE子句缺少通配符

当前参数值TEST1、TEST2未添加%通配符,这会让LIKE退化为精确匹配(和=效果完全一致),自然无法达到模糊匹配的预期。有两种解决方式:

方式一:直接在参数值中加入通配符

<param name="first" value="%TEST1%"/>
<param name="second" value="%TEST2%"/>

方式二:在WHERE子句中用数据库函数拼接通配符(更灵活)

以MySQL为例,使用CONCAT函数拼接:

<where>
    `from` LIKE CONCAT('%', :first, '%') OR
    `from` LIKE CONCAT('%', :second, '%') OR
    `to` LIKE CONCAT('%', :first, '%') OR
    `to` LIKE CONCAT('%', :second, '%')
</where>

修正后的完整ChangeSet示例(MySQL)

<changeSet id="LoremIpsum" author="JohnDoe">
    <update tableName="table_for_John_Doe">
        <column name="id" value="000001"/>
        <where>
            `from` LIKE :first OR
            `from` LIKE :second OR
            `to` LIKE :first OR
            `to` LIKE :second
        </where>
        <whereParams>
            <param name="first" value="%TEST1%"/>
            <param name="second" value="%TEST2%"/>
        </whereParams>
    </update>
</changeSet>

是否需要改用原生SQL?

如果修正上述问题后仍无法正常工作,或者你的业务逻辑涉及复杂的数据库特定语法,再考虑使用原生SQL。示例如下(MySQL):

<changeSet id="LoremIpsum" author="JohnDoe">
    <sql>
        UPDATE table_for_John_Doe 
        SET id = '000001'
        WHERE `from` LIKE '%TEST1%' OR `from` LIKE '%TEST2%' OR `to` LIKE '%TEST1%' OR `to` LIKE '%TEST2%';
    </sql>
</changeSet>

注意:原生SQL会失去Liquibase的跨数据库兼容性,仅建议在确定只针对单一数据库部署时使用。

内容的提问来源于stack exchange,提问作者xross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:43:28