需要帮助获取MySQL存储过程和CASE语句工作吗

需要帮助获取MySQL存储过程和CASE语句工作吗,mysql,stored-procedures,Mysql,Stored Procedures,我试图在MySQL中创建一个存储过程,我将使用PHP访问它。我目前正在从Oracle和MSSQL数据库管理员那里得到帮助,但我不相信她提供给我的一些信息与MySQL有关 我有一个返回所有数据的基本查询,但我希望能够过滤是否有任何输入参数。如果23个输入参数中有任何一个存在,我想添加到我的基本查询中。Oracle/MSSQL DBA说我应该使用MySQL案例语句来实现这一点。我最初只是在参数不存在的情况下使用“null”,但她说这不是好的做法。因此,我现在要做的是,如果参数存在,我想添加到常规查询

我试图在MySQL中创建一个存储过程,我将使用PHP访问它。我目前正在从Oracle和MSSQL数据库管理员那里得到帮助,但我不相信她提供给我的一些信息与MySQL有关

我有一个返回所有数据的基本查询,但我希望能够过滤是否有任何输入参数。如果23个输入参数中有任何一个存在,我想添加到我的基本查询中。Oracle/MSSQL DBA说我应该使用MySQL案例语句来实现这一点。我最初只是在参数不存在的情况下使用“null”,但她说这不是好的做法。因此,我现在要做的是,如果参数存在,我想添加到常规查询以过滤结果。当我尝试在MySQL中保存存储过程时,出现以下错误:

ERROR 1064 (42000) at line 6: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE when spVar01 IS NOT NULL THEN
    and alpha' at line 57
这是我的存储过程。如果能为我的存储过程提供帮助,我们将不胜感激

谢谢

use `my_database`;

DROP PROCEDURE IF EXISTS `queryWithFiltering`;

DELIMITER //
CREATE PROCEDURE `queryWithFiltering` (IN var1 INT,IN var2 INT,IN param01 VARCHAR(255),IN param02 VARCHAR(255),IN param03 DATE,IN param04 DATE,IN param05 DATE,IN param06 TINYINT(1),IN param07 INT(11),IN param08 INT(11),IN param09 INT(11),IN param10 INT(11),IN param11 DATE,IN param12 TINYINT(1),IN param13 VARCHAR(50),IN param14 VARCHAR(50),IN param15 DATE,IN param16 INT(11),IN param17 VARCHAR(50),IN param18 DECIMAL(13,2),IN param19 VARCHAR(50),IN param20 VARCHAR(50),IN param21 VARCHAR(50),IN param22 INT(11),IN param23 INT(11))
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'comment goes here ...'
BEGIN
DECLARE spVar01 VARCHAR(255);
DECLARE spVar02 VARCHAR(255);
DECLARE spVar03 DATE;
DECLARE spVar04 DATE;
DECLARE spVar05 DATE;
DECLARE spVar06 TINYINT(1);
DECLARE spVar07 INT(11);
DECLARE spVar08 INT(11);
DECLARE spVar09 INT(11);
DECLARE spVar10 INT(11);
DECLARE spVar11 DATE;
DECLARE spVar12 TINYINT(1);
DECLARE spVar13 VARCHAR(50);
DECLARE spVar14 VARCHAR(50);
DECLARE spVar15 DATE;
DECLARE spVar16 INT(11);
DECLARE spVar17 VARCHAR(50);
DECLARE spVar18 DECIMAL(13,2);
DECLARE spVar19 VARCHAR(50);
DECLARE spVar20 VARCHAR(50);
DECLARE spVar21 VARCHAR(50);
DECLARE spVar22 INT(11);
DECLARE spVar23 INT(11);

SET spVar01 = param01;
SET spVar02 = param02;
SET spVar03 = param03;
SET spVar04 = param04;
SET spVar05 = param05;
SET spVar06 = param06;
SET spVar07 = param07;
SET spVar08 = param08;
SET spVar09 = param09;
SET spVar10 = param10;
SET spVar11 = param11;
SET spVar12 = param12;
SET spVar13 = param13;
SET spVar14 = param14;
SET spVar15 = param15;
SET spVar16 = param16;
SET spVar17 = param17;
SET spVar18 = param18;
SET spVar19 = param19;
SET spVar20 = param20;
SET spVar21 = param21;
SET spVar22 = param22;
SET spVar23 = param23;

select ... where ...

CASE when spVar01 IS NOT NULL THEN
    and alpha like '%spVar01%'
END CASE;

CASE when spVar02 IS NOT NULL THEN
    and beta like '%spVar02%'
END CASE;

CASE when spVar03 IS NOT NULL THEN
    and gamma like '%spVar03%'
END CASE;

CASE when spVar04 IS NOT NULL THEN
    and delta like  '%spVar04%'
END CASE;

CASE when spVar05 IS NOT NULL THEN
    and epsilon like  '%spVar05%'
END CASE;

CASE when spVar06 IS NOT NULL THEN
    and zeta like  %spVar06%
END CASE;

CASE when spVar07 IS NOT NULL THEN
    and eta like %spVar07%
END CASE;

CASE when spVar08 IS NOT NULL THEN
    and theta like %spVar08%
END CASE;

CASE when spVar09 IS NOT NULL THEN
    and iota like %spVar09%
END CASE;

CASE when spVar10 IS NOT NULL THEN
    and kappa like %spVar10%
END CASE;

CASE when spVar11 IS NOT NULL THEN
    and lambda like '%spVar11%'
END CASE;

CASE when spVar12 IS NOT NULL THEN
    and mu like %spVar12%
END CASE;

CASE when spVar13 IS NOT NULL THEN
    and nu like '%spVar13%'
END CASE;

CASE when spVar14 IS NOT NULL THEN
    and xi like '%spVar14%'
END CASE;

CASE when spVar15 IS NOT NULL THEN
    and omicron like '%spVar15%'
END CASE;

CASE when spVar16 IS NOT NULL THEN
    and pi like %spVar16%
END CASE;

CASE when spVar17 IS NOT NULL THEN
    and rho like '%spVar17%'
END CASE;

CASE when spVar18 IS NOT NULL THEN
    and sigma like %spVar18%
END CASE;

CASE when spVar19 IS NOT NULL THEN
    and tau like '%spVar19%'
END CASE;

CASE when spVar20 IS NOT NULL THEN
    and upsilon like '%spVar20%'
END CASE;

CASE when spVar21 IS NOT NULL THEN
    and phi like '%spVar21%'
END CASE;

CASE when spVar22 IS NOT NULL THEN
    and chi like %spVar22%
END CASE;

CASE when spVar23 IS NOT NULL THEN
    and psi like %spVar22%
END CASE;

order by ID limit var1 offset var2;
END//

每个案例陈述应如下所示

CASE when spVarXX IS NOT NULL and alpha like '%spVarXX%'
    THEN <DO SOMETHING> 
END CASE;
应该是

'%spVar22%'

我建议先清理/检查语法,然后再试一次。在这之后,公布你的任何错误,并一步一步地处理。

你的案例陈述毫无意义。。。您根本没有
then
子句。你所拥有的一切基本上都是
if();if();if();if()case是这样工作的:case-WHEN-THEN-END,或者case-WHEN-THEN-ELSE-END。你需要看看如何在mysqlI中的where子句中使用case。我知道我在转录SP时会忘记一些东西。我已经将“THEN”添加回。Oracle/MSSQL DBA再次表示,如果数据是INT,我将不需要引号。我还将“然后”返回。另外,“和zeta相似的%spVar06%”是我添加到原始查询中的内容。我希望它改为“选择…”。。。什么时候和zeta类似于%spVar06%”。关于引号和变量类型,您是正确的。您的“,但是,它们是不正确的。我会试着把它限制在一个案例陈述中,并加以利用。它应该是这样的:当spVar01不为NULL时,则为'alpha'结束;除了一个案例外,我处理了所有案例,但仍然收到了相同的错误。我是否正确地附加到查询中?我是否需要在任何类型的描述符中附上“和zeta like%spVar06%”,以便将其添加到我的原始查询中?您是否使用正确的语法修改了CASE语句?发布修改后的SQL。我没有。我想您认为我希望“和类似于“%spVar15%”的omicron”成为决策逻辑的一部分,而我希望的是,如果spVar15不为null,则在原始查询的末尾附加“和类似于“%spVar15%”的omicron”。因此,最终的查询将是:“选择…where…和omicron,比如“%spVar15%”。
'%spVar22%'