2

我正在使用 SQL Server 并想检查今天的日期名称是否在单个字段/列的值列表中。

“start_days”列内容的示例是:

'Monday','Tuesday','Sunday'
'Thursday'
'Friday','Sunday'
'Tuesday','Sunday'
'Tuesday','Wednesday','Thursday','Friday'

我试图在此运行的代码是:

case
  when datename(weekday,getdate()) in (start_days) then 1
  else 0
end as today_flag

每行的结果都是 0。我在这里做错了什么,还是不能使用单个字段作为语句中的值列表?

4

2 回答 2

0

作为初学者:您应该修复您的数据模型,而不是在单个列中存储多个值。在数据库列中存储值列表基本上违背了关系数据库的目的。是有关该主题的相关阅读。

也就是说,这是使用模式匹配的一个选项:

case
  when ',' + start_days + ',' like '%,' + datename(weekday,getdate()) + ',%' then 1
  else 0
end as today_flag

如果列表中的值确实有单引号,那么我们需要将它们包含在匹配中:

case
  when ',' + start_days + ',' like '%,''' + datename(weekday,getdate()) + ''',%' then 1
  else 0
end as today_flag

如果值始终是工作日,则可以简化,因为不存在值重叠的风险:

case
  when start_days like '%''' + datename(weekday,getdate()) + '''%' then 1
  else 0
end as today_flag
于 2020-05-31T19:22:59.510 回答
0

该问题的正确答案是修复您的数据模式。像这样存储多个值会导致你遇到很多问题,而你现在被困在一个问题上。

在此之前,您可以使用LIKEoperator 来获得所需的结果,如下所示:

SELECT *, CASE WHEN 
                 Value LIKE CONCAT('%', QUOTENAME(DATENAME(WEEKDAY,GETDATE()), ''''), '%')
               THEN 1
               ELSE 0
          END
FROM
(
  VALUES
  ('''Monday'',''Tuesday'',''Sunday'''),
  ('''Thursday'''),
  ('''Friday'',''Sunday'''),
  ('''Tuesday'',''Sunday'''),
  ('''Tuesday'',''Wednesday'',''Thursday'',''Friday''')
) T(Value)

db<>fiddle这里你可以看到它是如何在线工作的。

于 2020-05-31T21:20:10.147 回答