mysql 如何简化一个SQL语句,使其具有大量的“case when then else ...”

xesrikrc  于 2022-11-21  发布在  Mysql
关注(0)|答案(3)|浏览(185)

运行带有大量when的sql代码:

case
    when callDuration >    0 and callDuration <  30 then  1.4
    when callDuration >=  30 and callDuration <  60 then  2.3
    when callDuration >=  60 and callDuration < 120 then  3.7
    when callDuration >= 120 and callDuration < 180 then  4.5
    when callDuration >= 180 and callDuration < 240 then  5.2
    when callDuration >= 240 and callDuration < 300 then  6.1
    when callDuration >= 300 and callDuration < 360 then  7.3
    when callDuration >= 360 and callDuration < 420 then  8.4
    when callDuration >= 420 and callDuration < 480 then  9.2
    when callDuration >= 480 and callDuration < 540 then 10.1
    when callDuration >= 540 and callDuration < 600 then 11.9
    when callDuration >= 600                        then 12.3
end as duration

如果有100行这样的when and then,如何简化它更优雅,我可以考虑使用金佳模板或查找表。有没有更好的方法,不受具体变体的限制?

cbwuti44

cbwuti441#

# # 接近

我 认为 最 优雅 的 解决 方案 是 查找 表 ( 您 在 上面 提到 过 ) 。
下面 是 一 个 示例 , 但 为了 简单 起见 , 我 没有 输入 示例 中 列出 的 所有 范围 。

# # 创建 数据

create table lookupTable(
startCallDuration int,
endCallDuration int,
returnValue float);

insert into lookupTable values (0,30,1.4);
insert into lookupTable values (30,60,2.3);
insert into lookupTable values (60,120,3.7);
insert into lookupTable values (120,999999999,4.5);

create table callDuration(
callDuration int );

insert into callDuration values (30);
insert into callDuration values (60);

中 的 每 一 个

# # SQL 语句

select returnValue from lookupTable l, callDuration c
where c.callDuration >= startCallDuration and
c.callDuration < endCallDuration;

格式

# # Sql 陈述 式 ( 内部 链接 )

select returnValue from lookupTable l inner join callDuration c
on c.callDuration >= startCallDuration and
c.callDuration < endCallDuration;

格式
SQL 小 提琴 : http://www.sql 小 提琴 网站

hi3rlvi2

hi3rlvi22#

  • 衷心 * 同意!这正是“查找表”的工作,它应该 * 一直 * 是数据库的一个基本部分。这些 “100行逻辑” 应该是“100行查找表”。@Menelaos给你看了两个例子。

现在,在继续下一步之前,您应该仔细搜索应用程序代码,寻找***所有(!)这样的“旧方法的混乱示例”,以确保它们 * 完全 * 匹配您的查找表替换策略。这是一个所谓的***高度普遍的更改,应该非常小心地处理。

agxfikkp

agxfikkp3#

针对BigQuery考虑以下事项

with lookup_table as (
  select 
    [0, 30, 60, 120, 180, 240, 300, 360, 420, 480, 540, 600] ranges,
    [1.4, 2.3, 3.7, 4.5, 5.2, 6.1, 7.3, 8.4, 9.2, 10.1, 11.9, 12.3] choice
)
select callDuration, choice[safe_offset(range_bucket(callDuration, ranges) - 1)] as duration
from your_table, lookup_table

如果应用于示例数据(your_table),如下所示

输出为

相关问题