2016-09-16 86 views
0

我穿越我的一切,这是可能的...的MySQL如果查询返回任何内容,尝试第二个查询

我现在有一个使用UNION ALL加入一堆查询起来有些SQL。所有内容都很重要,因为这些查询可能会返回相同的记录,而且我需要每个实例。

不幸的是,单个的SELECT没有很好的想法。它们合并了一个WHERE子句,它返回值与用户输入值匹配的所有记录,或者是NULL,现在我需要这些来只返回匹配的记录,或者只返回仅返回NULL的记录什么是第一次尝试返回...

换句话说,我有这样的事情......

SELECT foo,bar 
FROM foobar 
WHERE foo = bar 
OR foo IS NULL 
UNION ALL 
SELECT foo,bar 
FROM foobar 
WHERE foo = bar 
OR foo IS NULL 

和我,而不是需要这样的事情...

(
TRY.. 
SELECT foo,bar 
FROM foobar 
WHERE foo = bar 
..nothing? TRY.. 
SELECT foo,bar 
FROM foobar 
WHERE foo IS NULL 
) 
UNION ALL 
(
TRY.. 
SELECT foo,bar 
FROM foobar 
WHERE foo = bar 
..nothing? TRY.. 
SELECT foo,bar 
FROM foobar 
WHERE foo IS NULL 
) 

这可能吗?如果是这样,一个工作的例子会是什么样的?

+0

似乎在联盟的两个查询是相同的,所以..你想获得结果两次? – scaisEdge

+0

我只是为了这个例子而简化了。真正的脚本中实际上有数百个UNION ALL的不同查询。 – Ric

+0

对不起,但在你提出的方式,我不明白这个问题..尝试添加一个数据样本和预期的结果。 – scaisEdge

回答

0

对于每一个querygroups的,你可以用一个结构类似

... 
UNION ALL 
    SELECT foo,bar 
    FROM foobar 
    WHERE foo = bar 
    or foo is null and not exists (
     SELECT * 
     FROM foobar 
     WHERE foo = bar 
    ) 
UNION ALL 
... 

这将需要要么满足您的条件,或者,是否有满足您的条件没有行,该行是null。它可以使用foo上的索引。它会比你当前的查询慢一点(因为它必须评估两次查询foo = bar)。

+0

天才!这是一种享受,欢呼。 – Ric

相关问题