SQL / NetSuite:CASE(expr1)WHEN(>条件1)THEN 结果1 ...如何使其工作?

问题描述 投票:0回答:1

(NetSuite)我正在进行交易搜索,如果过去十二个月的加仑数在合同合规性的特定范围内,则应用按比例计算的违约金。我们每周至少有100,000笔交易。

我已经保存了这个搜索功能,但我想让它更快、更优雅/更简单。

这是当前的工作解决方案:

   CASE
   WHEN (expr1 >= xx) THEN outcome1
   WHEN (expr1 >= yy) THEN outcome2
   etc .. etc
   ELSE alt-outcome
   END

“expr1”是包含“SUM”和“CASE WHEN”的实际公式。

如果当前解决方案必须经过“outcome4”,则 NetSuite 会超时,因为它必须分别计算“expr1”四次(或更多),并且这需要太长时间。

但是,如果我使用以下内容,那么 NetSuite 只需要计算“expr1”一次,因此不会超时且速度更快:

   CASE (expr1)
   WHEN (>= xx) THEN outcome1
   WHEN (>= yy) THEN outcome2
   etc .. etc
   ELSE alt-outcome
   END

但是,如果我使用 ">"、"<", ">=" 或 "<=" ... as in either (>= xx) 或 (>= yy) .. 等,它总是会失败

请问如何进行这项工作?

sql netsuite
1个回答
0
投票

您可以尝试将 expr1 的结果放入子查询中,看看是否有帮助。如果是这样,请感到惊讶,优化器应该能够识别并合并冗余步骤,即使您最初是如何编写的。

select 
       case when expr1_result > xx then outcome1
            when expr1_result > yy then outcome2
            ...
            else alt_outcome
        end as final_name
  from (
        select st.*,
               expr1(<args>) as expr1_result
          from some_table st
       )
© www.soinside.com 2019 - 2024. All rights reserved.