【问题标题】:SQL CASE WHEN in a columnSQL CASE WHEN 在列中
【发布时间】: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 表,每个符合条件的日期都有一行,并且有一个指向现有表的外键。如果您想将日期连接成一个字符串以向用户显示数据,请将其作为查询处理,或者在表示层中更好地处理。

标签: sql sql-server tsql select case


【解决方案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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多