将一列分成多个 - SQL

时间:2011-10-14 14:18:08

标签: sql sql-server-2005 select case

我有一个名为@months的专栏,以这种格式存储数月

  

@month = '01 -03-05-11-12'

我想有一个SELECT查询将此列划分为12,使其成为1月,2月,3月

我的每一条记录都在前面。因此,如果记录中包含@month = '01 -03',则显示在1月和3月。可以这样做吗?或者任何接近的东西都足够好。

我使用了case语句,但无法生成结果。


代码,如果有人想尝试

create table recs(
id int not null primary key,
cust_name varchar(20),
callmonth varchar(36)
)

insert into recs values(1,'john','01-12')
insert into recs values(2,'Jessica','02-06')
insert into recs values(3,'Charlie','01-06')
insert into recs values(4,'steale','03-04')
insert into recs values(5,'Silica','01-02-03-04-05-06-07-08-09-10-11-12')
insert into recs values(6,'Luder','01-03-05-07-09-11-12')
insert into recs values(7,'Panther','01-06-12')
insert into recs values(8,'Dinky','03-04-15')

4 个答案:

答案 0 :(得分:1)

我可能不清楚你要做什么,但你可以使用以下内容分成12个表:

INSERT INTO January_table
SELECT *
FROM Original_table
WHERE month LIKE '%01%';

每个月执行此操作,它应该为您提供12个表,其中仅包含该月的值。然后,您可以使用视图来组合它们。

或者,如果您正在寻找一个查询,您可以使用如下所示的案例陈述:

INSERT INTO table
SELECT *
    CASE
    WHEN month LIKE '%01%' THEN 'True'
    ELSE 'False'
    END,
    CASE
    WHEN month LIKE '%02%' THEN 'True'
    ...
FROM Original_table;

这将生成一个表格,其中包含原始表格中的所有字段,后跟12个“每月列”,每个列都有一个真或假,表示该行中是否存在该月份。

答案 1 :(得分:0)

你应该用' - '分割值,然后你就会有一个表

然后你应该看看这个值是否在这个表中+它的字符串名称。

P.S。

你必须有这样一个表:

01 - jan
02 - feb
...
...

让我们说: 表月( TBLMNTH )将有( id , name )

e.g。 :

1 |   jan  
2 |   feb
select name from  TBLMNTH where @month CHARINDEX(name , @month)>-1

答案 2 :(得分:0)

我同意其他海报 - 你应该改变你的桌面设计 - 如果你拥有它的形式非常糟糕。

您的个案陈述通常应采用以下形式:

case when instr(month,'01') > 0 then 'Jan'

答案 3 :(得分:0)

创建SPLIT函数并将其与DATENAME一起使用,如下所示,您可以获得字符串格式的月份列表。我认为这将解决您的部分问题。

select  DATENAME(month, DATEADD(month, convert(int, val) , -1 )) AS month_str 
from  SPLIT('01-03-05-11-12', '-')

结果将是(在mssql服务器中测试;它正在运行)

January
March
May
November
December
  

UDF

CREATE FUNCTION SPLIT
(
 @s nvarchar(max),
 @splitChar nchar(1)
)
returns @t table (id int identity(1,1), val nvarchar(max))
as
begin

declare @i int, @j int
select @i = 0, @j = (len(@s) - len(replace(@s,@splitChar,'')))

;with cte 
as
(
 select
  i = @i + 1,
  s = @s, 
  n = substring(@s, 0, charindex(@splitChar, @s)),
  m = substring(@s, charindex(@splitChar, @s)+1, len(@s) - charindex(@splitChar, @s))

 union all

 select 
  i = cte.i + 1,
  s = cte.m, 
  n = substring(cte.m, 0, charindex(@splitChar, cte.m)),
  m = substring(
   cte.m,
   charindex(@splitChar, cte.m) + 1,
   len(cte.m)-charindex(@splitChar, cte.m)
 )
 from cte
 where i <= @j
)
insert into @t (val)
select pieces
from 
(
 select 
 ltrim(rtrim(case when i <= @j then n else m end)) pieces
 from cte
) t
where
 len(pieces) > 0
option (maxrecursion 0)

return

end

GO