SQL CASE WHEN 在列中

Posted

技术标签:

【中文标题】SQL CASE WHEN 在列中【英文标题】:SQL CASE WHEN in a column 【发布时间】:2021-10-31 13:41:10 【问题描述】:

如下图所示, 我想将 SQL Server DeliverDay 列 '0;1;2;3;4' 更改为 'Monday;Tuesday;Wednesday;Thursday;Friday'。 但我不想把它写成硬代码,例如:

CASE WHEN deliverDay = '0' THEN 'Monday'
WHEN deliverDay = '0;1' THEN 'Monday;Tuesday'
WHEN deliverDay = '0;1;2' THEN 'Monday;Tuesday;Wednesday'
WHEN deliverDay = '0;1;2;3' THEN 'Monday;Tuesday;Wednesday;Thursday'
WHEN deliverDay = '0;1;2;3;4' THEN 'Monday;Tuesday;Wednesday;Thursday;Friday'

我想编写一个 SQL 来自动将字符串“0”更改为“Monday”,将“1”更改为“Tuesday”,这样当有一个 DeliverDay 列可能是 '0;3;6' 时,它可以自动将 DeliverDay 列设置为 'Monday;Thursday;Sunday'。

有什么解决办法吗?欣赏它。

【问题讨论】:

试试replace()。不过,您总共需要嵌套七个调用。硬编码将涉及 128 个案例,我不记得 SQL Server 对其处理数量的限制。 参考这个db fiddle 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 使用SELECT DATEPART(WEEKDAY, GETDATE()) 得到你想要的结果。 这不是一个好的设计。您应该有一个DeliveryDays 表,每个符合条件的日期都有一行,并且有一个指向现有表的外键。如果您想将日期连接成一个字符串以向用户显示数据,请将其作为查询处理,或者在表示层中更好地处理。 【参考方案1】:

嵌套替换()。因此,最内层开始您的交货日期列并查找 0,将其更改为星期一。在那个结果之后,它现在下降到 1 和星期二,等等。

如果没有对应的数字,显然什么都不需要替换掉

select replace( replace( replace( replace( replace( deliveryday
    , '0', 'Monday')
    , '1', 'Tuesday' )
    , '2', 'Wednesday' )
    , '3', 'Thursday' )
    , '4', 'Friday' )
   from ...

因此,如果您的交货日期值为“0;2;4” 最内层将其转换为 'Monday;2;4' 没有找到值 1,所以仍然是 'Monday;2;4' 找到 2 个,因此它更改为 'Monday;Wednesday;4' 没有值 3,所以保持不变 最后找到一个 4 并变成 'Monday;Wednesday;Friday'

【讨论】:

以上是关于SQL CASE WHEN 在列中的主要内容,如果未能解决你的问题,请参考以下文章

sql 中 case when 语法

case when用法sql

Sqlserver的case when 用法

sql语句借助case when实现自动拼装where条件

Sql文的where中使用case when

SQL中case when then用法