【问题标题】:Getting number from place value in sql从sql中的位置值获取数字
【发布时间】:2018-02-14 03:17:32
【问题描述】:

我有一个设置了周一、周二、周三、周四、周五、周六和周日的表单。当填充到SQL数据库中时,它以7 0开始开头,每个0表示一周中的一天,当一周的一天被选择一个正确的位置。例如,如果选择星期一,则该值将为 1000000,如果星期二为 010000,星期三为 001000 等。用户可以选择多天,因此星期一和星期三可以是 101000,或者所有天都可以是 1111111。将其转换为 sql 查询以说明 1 是否在等于星期一的十万位中,如果 1 在 101000 中,则值是星期一和星期三的最佳途径是什么?

告诉我,谢谢!

【问题讨论】:

  • 我不明白这个问题。您是在询问数据库中的数据格式吗?基础表是什么样的?能改吗?
  • 它几乎就像一个位掩码,但更糟。
  • 这和dotnetnuke有什么关系?
  • 为什么不只使用七位列,一周中的每一天?

标签: sql sql-server tsql numbers dotnetnuke


【解决方案1】:

如果 2012+ 可以使用 concat()。还包括用于“更清洁”字符串的 STUFF()。

示例

Declare @YourTable table (SomeCol varchar(25))
Insert Into @YourTable values
('1000000'),
('1100000'),
('0100000'),
('1111111')

Select *
      ,NewCol = stuff(
                concat(
                ', '+IIF(substring(SomeCol,1,1)='1','Monday'   ,null)
               ,', '+IIF(substring(SomeCol,2,1)='1','Tuesday'  ,null)
               ,', '+IIF(substring(SomeCol,3,1)='1','Wednesday',null)
               ,', '+IIF(substring(SomeCol,4,1)='1','Thursday' ,null)
               ,', '+IIF(substring(SomeCol,5,1)='1','Friday'   ,null)
               ,', '+IIF(substring(SomeCol,6,1)='1','Saturday' ,null)
               ,', '+IIF(substring(SomeCol,7,1)='1','Sunday'   ,null)
               ),1,2,'')
 From  @YourTable

退货

SomeCol   NewCol
1000000   Monday
1100000   Monday, Tuesday
0100000   Tuesday
1111111   Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

编辑 - 2008 年

Declare @YourTable table (SomeCol varchar(25))
Insert Into @YourTable values
('1000000'),
('1100000'),
('0100000'),
('1111111')

Select *
      ,NewCol = stuff(
                case when substring(SomeCol,1,1)='1' then ', Monday'    else '' end
               +case when substring(SomeCol,2,1)='1' then ', Tuesday'   else '' end
               +case when substring(SomeCol,3,1)='1' then ', Wednesday' else '' end
               +case when substring(SomeCol,4,1)='1' then ', Thursday'  else '' end
               +case when substring(SomeCol,5,1)='1' then ', Friday'    else '' end
               +case when substring(SomeCol,6,1)='1' then ', Saturday'  else '' end
               +case when substring(SomeCol,7,1)='1' then ', Sunday'    else '' end
               ,1,2,'')
 From  @YourTable

【讨论】:

  • 谢谢,我试过了,但是我不断收到一些错误,比如 stuff 函数需要 4 个参数,第一个 IIF 附近的语法不正确,子字符串附近的语法不正确。会不会有我遗漏的东西?
  • @ndavern 没有语法错误。只需复制、粘贴和执行即可。你不是在 2012+ 吗?
  • @ndavern 您可以在 dbFiddle dbfiddle.uk/… 看到它在此处运行
  • 刚刚检查,实际运行 2008 :(
  • @ndavern 查看更新的答案
【解决方案2】:

听起来很奇怪......但也许你正在寻找这样的东西:

declare @var varchar(64) = '1010111'

select
    isnull(case when left(@var,1) = 1 then 'Monday' end,'')
    + ' ' +
    isnull(case when substring(@var,2,1) = 1 then 'Tuesday' end,'')
    + ' ' +
    isnull(case when substring(@var,3,1) = 1 then 'Wednesday' end,'')
    + ' ' +
    isnull(case when substring(@var,4,1) = 1 then 'Thursday' end,'')
    + ' ' +
    isnull(case when substring(@var,5,1) = 1 then 'Friday' end,'')
    + ' ' +
    isnull(case when substring(@var,6,1) = 1 then 'Saturday' end,'')
    + ' ' +
    isnull(case when right(@var,1) = 1 then 'Sunday' end,'')

【讨论】:

  • 我也写了同样的:D
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2018-11-14
  • 2022-01-18
  • 2021-05-30
相关资源
最近更新 更多