有没有更好的方法来重写以下内容:
SELECT DISTINCT Column1, 'Testing #1'
FROM MyTable
WHERE Column2 IS NOT NULL && Column3='Value'
UNION ALL
SELECT DISTINCT Column1, 'Testing #2'
FROM MyTable
WHERE Column3 IS NULL && Column2='Test Value'
UNION ALL
SELECT DISTINCT Column1, 'Testing #3'
FROM MyTable
Where ....
在大约35个联合所有语句中都查询同一个表。我想知道是否有更容易/更快的方法来做事。
答案 0 :(得分:4)
是的,你可以用像这样的案例陈述重写它
SELECT Column1,
CASE WHEN Column2 IS NOT NULL AND Column3='Value' THEN 'Testing #1'
WHEN Column3 IS NULL AND Column2='Test Value' THEN 'Testing #2'
ELSE 'Testing #3' END as customcol
FROM MyTable
编辑:好的,我正在进行此编辑,因为根据您的评论,我们需要解决两个问题。 (我将保留原来的答案,以防它可能对某人有所帮助。)
1)应过滤结果集,不应有else
部分。
这实际上可以通过此解决方案实现,因为else
是可选的,并且数据可以在最后使用where子句进行过滤。
2)如果符合条件,则能够多次选择具有不同Testing #
值的同一行。
然而,我之前的解决方案无法实现这一点。所以我想到了另一个。希望它适合你的情况。这是
S1 - 创建一个包含Testing #
值(Testing #1
,Testing #2
,Testing #3
等的新表格。假设此表名为Testing
。
S2 - 使用包含MyTable
值的Testing
表加入主表(Testing #
)。因此,现在您可以获得实际数据和测试值的所有可能组合。
S3 - 使用where子句过滤您不希望出现的结果。
S4 - 过滤实际数据< - >测试组合并添加where子句。
结束查询应如下所示:
SELECT M.Column1, T.TestingValue
FROM MyTable M
INNER JOIN Testing T ON 1=1
WHERE
(
(M.Column2 IS NOT NULL AND M.Column3='Value' AND T.TestingValue='Testing #1') OR
(M.Column3 IS NULL AND M.Column2='Test Value' AND T.TestingValue='Testing #2') OR
<conditions for other testing values>
)
AND
<other conditions>
我认为这应该有效并产生你想要的结果。但由于我没有数据,因此无法运行基于联合的解决方案的任何基准测试。所以我没有任何科学证据表明这种方法更快,但它是一种选择。你可以测试两者并使用更好的一个。
可能有点晚了,但希望这能解决你的问题。
答案 1 :(得分:0)
您可以在一个语句中执行此操作,但是您希望每个测试都有不同的列:
select column1,
(case when column2 is not null and column3 = 'Value' then 1 else 0
end) as Test1
(case when column3 is null and column3 = 'Test Value' then 1 else 0
end) as Test2,
. . .
from t;
因为你只想要事情失败的情况,你可以把它放在子查询中并测试任何失败:
select *
from (select column1,
(case when column2 is not null and column3 = 'Value' then 1 else 0
end) as Test1
(case when column3 is null and column3 = 'Test Value' then 1 else 0
end) as Test2,
. . .
from t
) t
where test1 + test2 + . . . > 0