【问题标题】:How to use IF condition in Stored Procedure Query如何在存储过程查询中使用 IF 条件
【发布时间】:2015-09-08 07:58:22
【问题描述】:

这是我的存储过程查询。在这里,如果 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

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

提前谢谢!!!!

【问题讨论】:

  • typeetrypes 是什么?他们来自哪里?你是什​​么意思“如果它存在”?你是什​​么意思“它应该添加第二个条件”?这个sproc到底应该做什么?投票结束是我读过的最不明确的问题之一。
  • 希望你现在清楚了!
  • 通过将trypes 更改为另一个typee,所以现在您正在将其与自身进行比较?不,我不能说这让它变得更加清楚根本。如果有的话,现在就更不清楚了——我没想到的事情是可能的。尝试回答我在之前评论中提出的问题:这可能会有所帮助。
  • 有时 typee 可能为空。因此,如果它以 null 形式出现,则应以 where id = id.. 结尾。如果 typee 不为 null,则必须添加另一个条件和 typee = typee
  • select * from country where id = id and typee = typee 这里 id 和 typee 是动态的。调用存储过程时会出现一些值

标签: mysql stored-procedures


【解决方案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 以查看字符串中的执行查询。

【讨论】:

  • 考虑我有另一个名为 is_primary 的变量或列,我需要同时检查 typee 和 is_primary。有时 is_primary 会为 null,或者 typee 会为 null,或者两者都为 null。这种情况该怎么办。我不能写可能如果。因此,在一个查询本身中,我需要检查所有内容。请告诉我该怎么做!
  • 我认为你不能在一个查询中做到这一点,但如果你能像我在顶部的示例中那样做到这一点,你可以更新IF 条件,将更新答案。
  • 我有多个要检查的列的大查询。我不能用多个 if 条件来检查每一列。如果它喜欢'select * from table where id = 1 if is_primary ==0 then and is_primary=0 end if; ' 这就是我在寻找的方式。
  • 非常感谢您的更新。对我来说工作得很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2015-04-22
  • 2017-07-11
  • 1970-01-01
  • 2012-04-17
  • 2016-06-27
相关资源
最近更新 更多