MSSQL用CASE替换WHERE子句的完整条件

时间:2011-10-05 13:24:35

标签: mysql sql-server sql-server-2008 postgresql

我需要使用依赖于主查询值的子句替换子查询中的where子句。 我必须替换完整的条件,而不仅仅是条件的右侧,所以我创建了一个如下所示的查询:

SELECT p.par_des AS description,
COALESCE(
(SELECT SUM(ope_tot) FROM operator WHERE 

(CASE WHEN p.par_cod = 'TEN01' THEN ope_cau = 'TEN01' OR ope_cau LIKE 'BAN__' ELSE ope_cau = p.par_cod END)

AND (ope_tim BETWEEN '00:00:00' AND '23:59:59' ) )
,0)  AS value 
FROM parameters p WHERE par_cod LIKE 'TEN__';

正如您在查询的粗体部分中所看到的,我根据主查询中字段的值替换了where子句的条件,如果条件满足,我还必须指定一个或运算符。 / p>

此查询在PostgreSQL和MySQL上运行良好,但它在MSSQL中不起作用,如何重写查询并让它在Microsoft SQL中也能正常工作?

最好的是同一个查询可以在所有这三个数据库服务器上运行而不进行任何更改:MySQL,PostgreSQL,MSSQL。

1 个答案:

答案 0 :(得分:3)

SQL Server不允许在此处尝试使用布尔表达式。

   CASE
     WHEN p.par_cod = 'TEN01' THEN ope_cau = 'TEN01'
                                    OR ope_cau LIKE 'BAN__'
     ELSE ope_cau = p.par_cod
   END  

以下内容应该适用于所有三个。

 CASE
         WHEN p.par_cod = 'TEN01' THEN CASE
                                         WHEN ope_cau = 'TEN01'
                                               OR ope_cau LIKE 'BAN__' THEN 1
                                       END
         ELSE CASE
                WHEN ope_cau = p.par_cod THEN 1
              END
       END = 1  

请注意,CASE子句中的WHERE个表达式完全不可分析