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

时间:2014-02-19 21:42:41

标签: mysql stored-procedures

我试图在MySQL中创建一个存储过程,我将使用PHP访问。我目前正在从Oracle和MSSQL DBA获得帮助,但我不相信她提供给我的一些信息与MySQL有关。

我有一个返回所有数据的基本查询,但我希望能够过滤是否有任何输入参数。如果存在23个输入参数中的任何一个,我想添加到我的基本查询。 Oracle / MSSQL DBA说我应该使用MySQL case语句来实现这一点。如果参数不存在,我最初只使用“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//

1 个答案:

答案 0 :(得分:1)

每个Case语句都应该是这样的......

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

您在几个案例陈述中也缺少引号。例如:

%spVar22% 

应该是

'%spVar22%'

我建议先清理/检查语法,然后重试。发布您之后的任何错误并逐步进行。

相关问题