【问题标题】:SQL IF SELECT query is null then do another querySQL IF SELECT 查询为空,然后执行另一个查询
【发布时间】:2014-08-04 14:37:10
【问题描述】:

我有一个定期返回“无”的查询,如果是这种情况,我想运行一个不同的查询,但我不知道这样做的方式。如果有人可以提供帮助,请。

这是我正在使用的当前代码...

SELECT * FROM cfg_users JOIN cfg_ash ON cfg_users.iUserId = cfg_ash.iUserid WHERE iTeamId='0' AND sDisabled IS NULL AND iStatusId > 0 AND sDate = '2014-08-01' GROUP BY cfg_users.iUserIdORDER BY iStatusId, sName

我基本上想说

IF <my code> IS NULL THEN <do other code>, IF <my code> IS NOT NULL THEN return the result.

谢谢

【问题讨论】:

  • if 语句只允许在存储程序中使用。您也许可以将您想要的内容设置为单个查询,但其他代码是一个谜。

标签: mysql sql select null


【解决方案1】:

有一些简单的方法只使用sql。

将您的第一个查询定义为临时表,使用 union all,使用临时表的计数过滤第二个查询。

with temp as (select * from t1 where 1=0)
select * from temp
union all
select * from t2 where (select count(*) from  temp) =0

此查询将返回第二个表的记录。

with temp as (select * from t1 )
select * from temp
union all
select * from t2 where (select count(*) from  temp) =0

如果临时查询有结果,则只返回临时查询。

您可以使用sql fiddle here 进行测试。

【讨论】:

    【解决方案2】:

    你可以这样做

    • 设置两个变量等于您要执行的查询。

    • 当第一个不为空时,设置另一个等于正确查询的变量。

    • 使用存储过程执行该查询。

    存储过程:

    DELIMITER $$
    
    CREATE PROCEDURE `dynamic_query`(in input varchar(255))
    BEGIN
        SET @a := input;
        PREPARE stmt FROM @a;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END
    $$
    
    DELIMITER ;
    

    您要执行的两个选择:

    SET @A := "SELECT * FROM  cfg_users JOIN cfg_ash ON cfg_users.iUserId = cfg_ash.iUserid WHERE iTeamId='0' AND sDisabled IS NULL AND iStatusId > 0 AND sDate = '2014-08-01' GROUP BY cfg_users.iUserId ORDER BY iStatusId, sName";
    SET @B := "your other select here";
    

    获取正确查询的定义器:

    SET @C := (
    SELECT
        CASE 
            WHEN EXISTS
                (   SELECT * 
                    FROM  cfg_users 
                    JOIN cfg_ash ON cfg_users.iUserId = cfg_ash.iUserid 
                    WHERE iTeamId='0' 
                        AND sDisabled IS NULL 
                        AND iStatusId > 0 
                        AND sDate = '2014-08-01' 
                    GROUP BY cfg_users.iUserId 
                    ORDER BY iStatusId, sName
                )
            THEN @A
            ELSE @B
        END
    );
    

    执行声明:

    CALL dynamic_query(@C);
    

    【讨论】:

    • 哇,不知道有这种可能。我将尝试一下,看看会发生什么。谢谢约翰·鲁德尔。
    • @Greylegface 不客气!查看演示以查看它的实际效果.. 诀窍是您需要设置存储过程并将其保存到数据库中,这是一个简单的查询:)
    【解决方案3】:

    您可以将结果存储在临时表/表变量中,然后检查计数

    例如

    CREATE TABLE #Results ( --columns you need here )
    INSERT INTO #Results SELECT * 
    FROM  cfg_users 
    JOIN cfg_ash ON cfg_users.iUserId = cfg_ash.iUserid WHERE iTeamId='0' AND sDisabled IS NULL AND iStatusId > 0 AND sDate = '2014-08-01' 
    GROUP BY cfg_users.iUserId 
    ORDER BY iStatusId, sName
    
    SET @Count = SELECT COUNT(*) FROM #Results
    
    IF 0 = @Count THEN
    INSERT INTO #Results -- Other Query Here
    
    SELECT * FROM #Results
    

    n.b.你真的应该在两个查询中指定你想要的列,而不是使用 *

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多