mysql案例语句,有些有效,有些无效

mysql案例语句,有些有效,有些无效,mysql,case,mariadb,Mysql,Case,Mariadb,我试图在存储过程中运行它,但问题似乎在于我的case语句处理_注册和_警告部分 这个想法是表中的所有条目都有一种注册类型,0或1,我想通过一个参数,选择所有带有1的注册或带有2的注册,或者简单地选择所有注册,不管注册的值是多少 我的尝试显然失败了 create procedure get_table_information3(_sort character(2), _start int, _page int, _seek varchar(64), _registrations varchar(6

我试图在存储过程中运行它,但问题似乎在于我的case语句处理_注册和_警告部分

这个想法是表中的所有条目都有一种注册类型,0或1,我想通过一个参数,选择所有带有1的注册或带有2的注册,或者简单地选择所有注册,不管注册的值是多少

我的尝试显然失败了

create procedure get_table_information3(_sort character(2), _start int, _page int, _seek varchar(64), _registrations varchar(64), _warnings varchar(64),  _categories varchar(64))
begin   
    select * from Students
    where  
        first_name like coalesce(concat('%', _seek, '%'), first_name) or
        last_name like coalesce(concat('%', _seek, '%'), last_name) or
        email like coalesce(concat('%', _seek, '%'), email) or
        comments like coalesce(concat('%', _seek, '%'), comments)  
            case when _registrations = 0 then and reg = 0,
        case when _registrations = 1 then and reg = 1 end,
        case when _warnings = 0 then and warning = 0,
        case when _warnings = 1 then and warning = 1 end,
        order by
        case when _sort = 'fa' then first_name end asc,
        case when _sort = 'fd' then first_name end desc,
    limit _start, _page;
end
最后两个case语句可以工作,我知道这是因为该过程在删除4个第一个case语句时运行。然而,当添加这些时,一切都失败了

如果知道这一点很重要,我会使用MariaDB。错误消息:

1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解使用near'和reg=0 end的正确语法, 如果_registrations=1,则reg=1结束,'

我读过,但显然有些东西我不明白

非常感谢你的帮助

问候,, 尼古拉斯

编辑

我也试过这个:

创建过程获取\u表\u信息3\u排序字符2、\u开始整数、\u页面整数、\u查找varchar64、\u注册varchar64、\u警告varchar64、\u类别varchar64 开始 从学生中选择* 哪里 第一个名称,如聚结“%”、搜索“%”、第一个名称或 姓氏,如联合搜索“%”、搜索“%”、姓氏或 电子邮件,如联合搜索“%”、搜索“%”、电子邮件或 注释,如联合搜索“%”、搜索“%”、注释和 案例登记 当0时,则reg=0, 当1那么reg=1时, 0,1中的else reg 终局 订购人 当_sort='fa'然后第一个_nameend asc时, 当_sort='fd'然后是first_name end desc时的情况, 限制开始,第页; 结束


这应该是我想要的,但是是语法错误,尽管我认为我已经从手册中复制了语法…

不确定这是否准确捕获了您想要的逻辑,但它应该给您一个想法

如果_registrations=0,则检查reg=0的CASE语句应该如下所示

case when _registrations = 0 then reg = 0 ELSE 1 END
如果_registrations=0,则返回reg=0的值,否则返回1 true,也就是说,如果_registrations为0,则表达式始终为true

这使得整个查询有点像

create procedure get_table_information3(_sort character(2), _start int, _page int, _seek varchar(64), _registrations varchar(64), _warnings varchar(64),  _categories varchar(64))
begin   
    select * from Students
    where  
       (first_name like coalesce(concat('%', _seek, '%'), first_name) or
        last_name like coalesce(concat('%', _seek, '%'), last_name) or
        email like coalesce(concat('%', _seek, '%'), email) or
        comments like coalesce(concat('%', _seek, '%'), comments)) AND 
        case when _registrations = 0 then reg = 0 ELSE 1 END AND
        case when _registrations = 1 then reg = 1 ELSE 1 END AND
        case when _warnings = 0 then warning = 0 ELSE 1 END AND
        case when _warnings = 1 then warning = 1 ELSE 1 END
        order by
        case when _sort = 'fa' then first_name end asc,
        case when _sort = 'fd' then first_name end desc
    limit _start, _page;
end
//

如果_registrations=0,则reg=0看起来不正确。你用这句话到底想达到什么目的?如果_registrations=0且reg=0,则1 else 0结束?那么,在编写正常的select*-语句时,通常使用and、or等分隔条件。这里不需要这样做吗?这是CASE THEN ELSE END,但在这种情况下,您使用的是THEN,而这是毫无意义的。条件是什么?如果是真的,你想要的值是什么?请参阅原始帖子中的编辑以获得更清晰的描述。谢谢你的帮助,我得到的错误较少,但它仍然不会运行。早些时候它抱怨case语句中的语法错误,但现在它说1064-您的SQL语法有错误;检查与MariaDB服务器版本对应的手册,以了解第28行附近要使用的正确语法。第28行是行限制_start,_page;,但我看不出哪里不对。在程序的这一部分之前,我还有一些代码,但是这一部分没有引起任何错误,所以我没有在这里说明我解决了它,在我要导入程序的文件中,一个愚蠢的输入错误导致了最后一个错误。谢谢