mysql案例语句,有些有效,有些无效
我试图在存储过程中运行它,但问题似乎在于我的case语句处理_注册和_警告部分 这个想法是表中的所有条目都有一种注册类型,0或1,我想通过一个参数,选择所有带有1的注册或带有2的注册,或者简单地选择所有注册,不管注册的值是多少 我的尝试显然失败了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
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;,但我看不出哪里不对。在程序的这一部分之前,我还有一些代码,但是这一部分没有引起任何错误,所以我没有在这里说明我解决了它,在我要导入程序的文件中,一个愚蠢的输入错误导致了最后一个错误。谢谢