我有一个定期返回“没有”的查询,如果是这种情况我想运行不同的查询,但我不知道这样做的方式。如果有人可以帮忙请。
这是我正在使用的当前代码......
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
我基本上想说
IF <my code> IS NULL THEN <do other code>, IF <my code> IS NOT NULL THEN return the result.
由于
答案 0 :(得分:3)
有一些简单的方法只使用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进行测试。
答案 1 :(得分:1)
你可以这样做的方式就像这样
设置两个等于您要执行的查询的变量。
当第一个变量不为空时,设置另一个变量等于正确的查询。
使用存储过程执行该查询。
存储程序:
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);
答案 2 :(得分:0)
您可以将结果存储在临时表/表变量中,然后检查计数
e.g。
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。您应该在两个查询中指定所需的列,而不是使用*