【问题标题】:MySQL not rlike clause returns error 'empty (sub)expression' from regexpMySQL not rlike 子句从正则表达式返回错误“空(子)表达式”
【发布时间】:2021-01-10 13:32:03
【问题描述】:

我在下面的where 子句(最后一行)中遇到了问题:

create procedure getSubjects(IN excludeName VARCHAR(255))
begin
    select *

    from subject

    where excludeName = '' or subject.name not rlike excludeName;
end

存储过程没有报错,但是每次调用过程不带空参数都会得到ERROR 1139 (42000) at line 1: Got error 'empty (sub)expression' from regexp。

我该如何写这个子句?

注意:

我使用以下语法得到相同的错误:

create procedure getSubjects(IN excludeName VARCHAR(255))
begin
    select *
    from subject
    where 
        case excludeName
            when '' then 
                subject.name rlike '.*' 
            else
                subject.name not rlike excludeName
            end;
end

【问题讨论】:

  • 恢复条件:if(includeName != '', includeName, '.*')。 Else 部分将应用于空字符串(条件为假)和 NULL(条件为 NULL,被视为假)。与第二个条件相同。

标签: mysql stored-procedures conditional-statements where-clause


【解决方案1】:

我最终使用a regexp which never matches anything (^\b\B$) 给出以下语法:

create procedure getSubjects(IN excludeName VARCHAR(255))
begin
    select *
    from subject
    where subject.name not rlike if(excludeName is null or excludeName = '', '^\b\B$', excludeName);
end

【讨论】:

    【解决方案2】:

    使用IFNULL() 将空值替换为默认值。

    create procedure getSubjects(IN includeName VARCHAR(255), 
                                 IN excludeName VARCHAR(255))
    begin
        select *
        from subject
        where subject.name rlike if(IFNULL(includeName, '') = '', '.*', includeName)
        and (IFNULL(excludeName, '') = '' or subject.name not rlike excludeName);
    end
    

    【讨论】:

    • 我将在我的问题中删除该子句的第一部分(效果很好),以专注于错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多