可选的WHERE子句根据存储过程中的参数搜索不同的字段

时间:2014-12-27 08:03:04

标签: mysql sql database stored-procedures

Table Example

CREATE TABLE offices
    (`office_id` int,`country` varchar(50),`population` int)
;

INSERT INTO offices
    (`office_id`,`country`,`population`)
VALUES
    (1,'AU',20000),
    (2,'US',1200),
    (3,'UK',150000),
    (4,'NZ',1200)

;

我在存储过程中使用了一个可选的where子句,如下所示:

DELIMITER //
CREATE PROCEDURE GetOfficeByCountry(IN yr_val varchar(50))
 BEGIN
 SELECT * 
 FROM offices
 WHERE yr_val IS NULL OR country RLIKE yr_val
 ASC
 END //
DELIMITER ;

我想知道是否可以根据参数CASE WHENWhere Clause用于不同的yr_where。如果它是1,那么在国家/地区字段中查找值,如果为2,则在人口字段中查找:

DELIMITER //
CREATE PROCEDURE GetOfficeByCountry(IN yr_where tinyint(1),IN yr_val varchar(50))
 BEGIN
 SELECT * 
 FROM offices
 WHERE 1 = 1
 CASE yr_where
        WHEN 1 THEN AND country RLIKE yr_val 
        WHEN 2 THEN AND population > yr_val
        ELSE 1 END  
 ASC
 END //
DELIMITER ;

2 个答案:

答案 0 :(得分:2)

不,您不能在case条款中使用where。但你也可以这样做

DELIMITER //
CREATE PROCEDURE GetOfficeByCountry(IN yr_where tinyint(1),IN yr_val varchar(50))
 BEGIN
   SELECT * 
   FROM offices
   WHERE (yr_where = 1 and country RLIKE yr_val)
   OR    (yr_where = 2 and population > yr_val)
 END //
DELIMITER ;

答案 1 :(得分:2)

使用此:

WHERE 1 = 1
AND CASE yr_where
        WHEN 1 THEN country RLIKE yr_val
        WHEN 2 THEN population > yr_val
        ELSE 1
    END

必须在允许表达式的地方使用CASE表达式,该表达式位于AND之后。