1

有没有更好的方法来重写以下内容:

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 个联合所有语句,它们都查询同一个表。我想知道是否有更简单/更快的方法来做事。

4

2 回答 2

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 子句过滤数据。

Testing #2)如果符合条件,则能够多次选择具有不同值的同一行。

然而,这是我以前的解决方案无法实现的。所以我想到了一个不同的。希望它适合你的情况。这里是

Testing #S1 - 使用值(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>

我认为这应该有效并产生您想要的结果。但由于我没有数据,我无法运行任何基准测试与基于联合的解决方案。所以我没有任何科学证据表明这更快,但这是一种选择。您可以测试两者并使用更好的。

可能有点晚了,但希望这能解决您的问题。

于 2013-07-10T00:30:23.780 回答
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
于 2013-07-10T00:51:45.770 回答