【问题标题】:How to repeat rows based on different columns in SQL ServerSQL Server 中如何根据不同的列重复行
【发布时间】:2018-02-13 17:14:42
【问题描述】:

我的表格包含 MondayTuesdayWednesdayThursdayFriday 列,并且是 布尔类型 现在我想进行查询以转换这些行到单列Weekday。它应该告诉我当天的名称哪一列是真的。

【问题讨论】:

  • SQL Server 没有Boolean 类型。
  • 顺便说一句,SQL 服务器有一个布尔类型的位数据类型。

标签: sql sql-server tsql weekday


【解决方案1】:

注意:我认为您的意思是 bit 类型,而不是仅接受 0/1Boolean

数学方法可以是这样的:

select 
    datename(weekday,
       Monday + Tuesday*2 + Wednesday*3 + Thursday*4 + Friday*5 - 1) as weekDayName
from 
    t;

[ SQL Fiddle Demo ]

旁注:

datename(weekday, 0) => Monday
datename(weekday, 1) => Tuesday
datename(weekday, 2) => Wednesday
datename(weekday, 3) => Thursday
datename(weekday, 4) => Friday
datename(weekday, 5) => Saturday
datename(weekday, 6) => Sunday / datename(weekday, -1) => Sunday

【讨论】:

  • 非常感谢您的时间和关心我还使用了另一种方式......
  • 干得好。应该是已接受的答案 +1
【解决方案2】:

您可以使用case。在 SQL Server 中获取逗号分隔的列表:

select t.*,
       stuff( ((case when Monday <> 0 then ',Monday' else '' end) +
               (case when Tuesday <> 0 then ',Tuesday' else '' end) +
               . . .
              ), 1, 1, ''
            ) as weekdays
from t;

我不知道您如何指定“真实”值。以上假设非零值为真。

【讨论】:

    【解决方案3】:

    正如所指出的,SQL Server 没有布尔类型,但它确实有一个BIT 类型,它只能接受两个值,0 和 1。我假设您使用的是位列。我还假设每一行中只会选择一天。有了这两个假设,您只需要一个 CASE 表达式:

    SELECT
        CASE WHEN Monday = 1    THEN 'Monday'
             WHEN Tuesday = 1   THEN 'Tuesday'
             WHEN Wednesday = 1 THEN 'Wednesday'
             WHEN Thursday = 1  THEN 'Thursday'
             WHEN Friday = 1    THEN 'Friday' END AS day_selected
    FROM yourTable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2022-01-07
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多