gpt4 book ai didi

postgresql - postgres 中的 IIF

转载 作者:行者123 更新时间:2023-11-29 11:26:10 25 4
gpt4 key购买 nike

我正在尝试将 MS-Access 查询转换为 postgres 语句,以便我可以在 SSRS 中使用它。除了 IIF 声明外,似乎工作得很好。

SELECT labor_sort_1.ncm_id
,IIf(labor_sort_1.sortby_employeeid = 3721
, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 29 * labor_sort_1.number_of_ops)
, IIf(labor_sort_1.sortby_employeeid = 3722
, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 24 * labor_sort_1.number_of_ops)
, IIf(labor_sort_1.sortby_employeeid = 3755, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 24 * labor_sort_1.number_of_ops)
, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 17 * labor_sort_1.number_of_ops)))) AS labor_cost
FROM ...

它返回以下信息 函数 iif(boolean, interval, interval) 不存在我该如何解决这个问题?

最佳答案

您需要将逻辑切换到 CASE表达。 CASE 表达式是大多数 RDBMS 的标准表达式,因此值得学习。在您的情况下(双关语意),它将转换为:

CASE 
WHEN labor_sort_1.sortby_employeeid = 3721
THEN (labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 29 * labor_sort_1.number_of_ops
WHEN labor_sort_1.sortby_employeeid = 3722
THEN (labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 24 * labor_sort_1.number_of_ops
WHEN labor_sort_1.sortby_employeeid = 3755
THEN (labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 24 * labor_sort_1.number_of_ops
ELSE
(labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 17 * labor_sort_1.number_of_ops)
END AS labor_cost

这看起来更简洁,因为您不必处理嵌套的 iif() 问题以及所有这些问题,如果您需要添加更多 employeeid 到硬编码的人工成本 list ,这没什么大不了的。

您可能还会发现 IN 条件对我们有利,因此您只需要两个 WHEN 子句:

CASE 
WHEN labor_sort_1.sortby_employeeid = 3721
THEN (labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 29 * labor_sort_1.number_of_ops
WHEN labor_sort_1.sortby_employeeid IN (3722, 3755)
THEN (labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 24 * labor_sort_1.number_of_ops
ELSE
(labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 17 * labor_sort_1.number_of_ops)
END AS labor_cost

此外,您可以将 CASE 表达式移动到等式中,这样逻辑只需要确定您希望乘以的任何数字:

(labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) 
* 24
* CASE
WHEN labor_sort_1.sortby_employeeid = 3721 THEN 29
WHEN labor_sort_1.sortby_employeeid IN (3722,3755) THEN 24
ELSE 17
END
* labor_sort_1.number_of_ops AS labor_cost

关于postgresql - postgres 中的 IIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45919937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com