【问题标题】:optional WHERE clause searching for different fields based on a parameter in stored procedure可选的 WHERE 子句根据存储过程中的参数搜索不同的字段
【发布时间】:2014-12-27 08:03:03
【问题描述】:

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 ;

我想知道是否有办法根据参数yr_whereCASE WHEN 用于不同的Where Clause。如果为 1,则在 country 字段中查找值,如果为 2,则在 population 字段中查找:

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 ;

【问题讨论】:

    标签: mysql sql database stored-procedures


    【解决方案1】:

    不,您不能在这样的 where 子句中使用 case。但你也可以这样做

    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 ;
    

    【讨论】:

      【解决方案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 之后。

      【讨论】:

        猜你喜欢
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多