基于变量的动态WHERE条件

时间:2012-11-06 17:02:01

标签: sql sql-server

我在SQL Server中有以下行

((@data_inicial IS NULL OR @data_inicial = '') 
OR 
tbSO.dt_criacao >= CAST(@data_inicial AS DATE))

我需要使用字段tbSO.dt_criacao,这取决于我收到@cod_status的一个参数。

如果@cod_status = 1,我必须使用tbSO.dt_criacao
如果@cod_status = 2,我必须使用tbSO.dt_abertura
如果@cod_status = 3,我必须使用tbSO.dt_fechamento

你能帮我解决这个问题吗?

最好的问候

Milton Camara

3 个答案:

答案 0 :(得分:2)

下面的CASE声明不会满足您的需求吗?您可以让then语句设置变量。

CASE @cod_status 
 When 1 then tbSO.dt_criacao 
 When 2 Then tbSO.dt_abertura 
 When 3 Then tbSO.dt_fechamento 
END

答案 1 :(得分:1)

希望这有帮助

((@data_inicial IS NULL OR @data_inicial = '') 
OR 
(@cod_status = 1 and tbSO.dt_criacao >= CAST(@data_inicial AS DATE))
OR 
(@cod_status = 2 and tbSO.dt_abertura  >= CAST(@data_inicial AS DATE))
OR 
(@cod_status = 3 and tbSO.dt_fechamento >= CAST(@data_inicial AS DATE))

此致

答案 2 :(得分:1)

CASE语句是将条件置于查询中的野兽方式。您可以使用Case语句计算依赖于其他列或条件的任何新列。您还可以在SUM,AVG,count等功能中使用case语句。你也可以将case语句放在where条件中。

您可以使用以下语法..

SELECT *
FROM TABLE
WHERE
1 = CASE 
        WHEN (
               (@data_inicial IS NULL OR @data_inicial = '') 
               OR 
               (
               CASE @cod_status 
                    When 1 then tbSO.dt_criacao 
                    When 2 Then tbSO.dt_abertura 
                    When 3 Then tbSO.dt_fechamento 
               END >= CAST(@data_inicial AS DATE)
               )
             ) THEN 1 ELSE 0 
    END