如何在存储过程查询中使用IF条件

时间:2015-09-08 07:58:23

标签: mysql stored-procedures

这是我的存储过程查询。如果typee存在,它应该添加第二个条件或不应该添加。 我的表结构是这样的

|id | name | typee |is_primary|
|1  |IND   |0      |1         |
|2  |SRIL  |1      |0         |

我的存储过程查询如下

CREATE DEFINER=`root`@`localhost` PROCEDURE `testIfCondition`(IN countryId int(11),IN typee INT(11),IN is_primary INT(11),
out name VARCHAR(50))
BEGIN
     select name from country where id = id
        if typee != 0 then
          and typee= typee 
        end if;
       if is_primary !=0 then
          and primary = primary 
        end if;
END

在上面的查询中,有值必须执行。如果有人知道请帮帮我。当我尝试它时会给出一些语法错误。请告诉我正确的语法来解决我的问题。

提前致谢!!!!

1 个答案:

答案 0 :(得分:1)

我不认为您可以使用IF语句添加更多条件。 您可以选择两次或更多次并将其添加到temporary table,例如:

首先创建temporary table

DECLARE @tempTable TABLE (
    ID INT,
    Name NVARCHAR(250),
    Typee INT
)

然后将第一个SELECT结果插入@tempTable

INSERT INTO @tempTable
SELECT * FROM country WHERE id = countryId

然后使用条件检查typee是否为NULL

IF typee IS NOT NULL AND is_primary IS NOT NULL THEN
    SELECT * FROM @tempTable WHERE typee = typee AND is_primary = is_primary
ELSE IF typee IS NOT NULL THEN
    SELECT * FROM @tempTable WHERE typee = typee
ELSE IF is_primary IS NOT NULL THEN
    SELECT * FROM @tempTable WHERE is_primary = is_primary
ELSE
    SELECT * FROM @tempTable
END

虽然我认为这不是最好的做法。

编辑:

根据其他答案here,您可以先将query创建为字符串,然后执行它。您的sp应如下所示:

CREATE DEFINER=`root`@`localhost` PROCEDURE `testIfCondition`(IN countryId int(11),IN typee INT(11),IN is_primary INT(11),
out name VARCHAR(50))
BEGIN
    SET @query = CONCAT('select name from country where id = ', countryId);
    if typee <> 0 then
        SET @query = CONCAT(@query, ' AND typee = ', typee);
    end if;
    if is_primary <> 0 then
        SET @query = CONCAT(@query, ' AND is_primary = ', is_primary);
    end if;

    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

您可以查看here以查看字符串中的执行查询。