我需要使用依赖于主查询值的子句替换子查询中的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。
答案 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
个表达式完全不可分析