Crystal Reports 2016命令对象WHERE子句用Case/IIF报语法错误
Crystal Reports Command查询语法错误解决方案
错误原因
SQL Server 的CASE/IIF仅支持返回标量值,不能直接返回布尔判断表达式作为WHERE的判断条件。你原语句将Material_Trans.Tran_Type Like 'Transfer' And ...这类判断逻辑放在CASE的THEN分支中,不符合SQL语法规范,因此会在LIKE位置触发语法报错,替换为=或IIF时逻辑本质没有变化,所以报错位置不变。
另外你原语句中LIKE 'Transfer'没有使用通配符,和= 'Transfer'执行效果完全一致,直接用等于判断性能更好。
修正后的查询语句
推荐直接用逻辑运算符组合条件,写法更简洁易读:
SELECT DISTINCT Material_Trans.Material_Trans_Date AS Mtd, Material_Trans.Job AS TmJb FROM PRODUCTION.dbo.Material_Trans Material_Trans WHERE Material_Trans.Tran_Type = 'Transfer' AND ( '{?IssueStock}' <> 'Stock' OR Material_Trans.Material_Trans_Date BETWEEN {?SDate} AND {?EDate} ) ORDER BY Material_Trans.Material_Trans_Date DESC
可选CASE写法
如果需要保留CASE的编写习惯,可以调整为返回标量值后做等值判断的格式:
SELECT DISTINCT Material_Trans.Material_Trans_Date AS Mtd, Material_Trans.Job AS TmJb FROM PRODUCTION.dbo.Material_Trans Material_Trans WHERE Material_Trans.Tran_Type = 'Transfer' AND 1 = CASE WHEN '{?IssueStock}' = 'Stock' THEN CASE WHEN Material_Trans.Material_Trans_Date BETWEEN {?SDate} AND {?EDate} THEN 1 ELSE 0 END ELSE 1 END ORDER BY Material_Trans.Material_Trans_Date DESC
内容的提问来源于stack exchange,提问作者Terry S
相关产品推荐
相关产品推荐

