首页 > 解决方案 > 使用单列更改值评估 CASE/WHEN

问题描述

我正在尝试将一些在某些数据表中操作数据的 C# 脚本转换为完成相同事情的 SQL (Presto DB) 脚本。

C# 代码通常会根据脚本中的不同条件更改列的值。我无法在 SQL 中完成相同的任务,因为 C# 是过程性的,而 SQL 是单个事务。

SELECT
    IF(("ColumnA" = 'BS'), IF(("ColumnB" = '76'), "ColumnD", '2850'), '2850') "Result"
, CASE 
        WHEN ((("ColumnC" = 'IS') AND (("ColumnB" LIKE '125%') OR ("ColumnB" LIKE '126%'))) AND (CAST("ColumnD" AS Decimal(18,2)) < 2999)) THEN '2850' 
        WHEN ("ColumnC" = 'IS') AND (("ColumnB" LIKE '1%') OR ("ColumnB" LIKE '3%')) AND (CAST("ColumnD" AS Decimal(18,2)) = 2351) THEN '2351'
        WHEN ("ColumnC" = 'IS') AND (("ColumnB" LIKE '1%') OR ("ColumnB" LIKE '3%')) AND (CAST("ColumnD" AS Decimal(18,2)) = 2202) THEN '2202' 
        WHEN ("ColumnB" = '125999') THEN '2351' 
        WHEN ("ColumnB" = '126240') OR ("ColumnB" = '126245') THEN '2202' 
        WHEN ("ColumnB" = '125998') THEN '2351' 
        WHEN ("ColumnB" = '125997') THEN '2351'
    END
    ) "Result"

在 CASE .. WHEN 子句中,将评估所有 CASE 并选择最后一个 CASE,还是选择评估为 TRUE 的第一个 CASE,这就是该列的情况?如果是后者,我需要弄清楚如何将第一个 IF 语句合并到下面的 CASE WHEN 子句中。

标签: sqlprestocase-whentrino

解决方案


CASE...WHEN是自上而下评估THEN的,第一个WHEN评估为 true 的子句是结果。WHEN不评估其他子句。

您可以或多或少地将其转换为 C# 代码,方法是将'if(...)' 中的第一个、后面的所有WHENs和s转换为。CASEWHENelse if(...)THEN{ return ... }

如果你有嵌套if的s,在C#中有或没有else你想翻译成的CASE ... WHEN,你也可以嵌套CASE WHENs,即一个WHEN子句可以包含另一个CASE ... WHEN


推荐阅读