如何将字符串转换为SQL中的位置列表?

时间:2013-01-24 14:41:39

标签: sql sql-server-2005

我目前有数据存储与命名期间相关的周数,如下表所示,其中包含PERIOD和DATESTRING列

PERIOD  DATESTRING
Period1 NNYNYY    //The position of 'Y' indicates a yes, 'N' indicates no
Period2 NNNNNY
...

因此,由于第3周是第1期的一部分,因此该期间的日期字符串中的第3位有一个“Y”。

我需要将其转换为一个表格,该表格中包含一个句点,以及Ys在下一个列中的位置:

PERIOD  WEEKNUMBER
Period1 3
Period1 5
Period1 6
Period2 6
...

4 个答案:

答案 0 :(得分:1)

您可以通过加入数字表并使用substring()函数在每个位置获取字符来执行此操作:

with numbers as (
    select 1 as num
    union all
    select num + 1 from numbers
    where num < 53
)
select period,num from table1
    join numbers on substring(datestring,num,1) = 'Y';

这使用递归查询来构建数字表。

Here it is in SQL Fiddle

我在SQL Server 2008上构建并测试了它,但我认为在2005年这样做不应该是一个问题。你最多必须调整它。

答案 1 :(得分:1)

使用Recursive CTE charindex查找YDEMO)的{{3}}是另一种方法:

with cte as (
  select period, charindex('Y', datestring) as weeknumber
    from Periods
   where charindex('Y', datestring) <> 0

  union all

  select p.period, charindex('Y', p.datestring, cte.weeknumber + 1) as weeknumber
    from periods p
    join cte on p.period = cte.period
   where charindex('Y', p.datestring, cte.weeknumber + 1) <> 0
)
select * from cte
order by period, weeknumber

答案 2 :(得分:0)

这是你的一些想法。这是Oracle查询,但我认为它应该适用于任何SQL,或者您可以修复它以在SQL Srv 2005中工作。所有使用的函数都是ANSI SQL标准。我不确定2005年是否有LEVEL这样的东西......:

SELECT 'Period1'||' '||Y_Pos as Y_Pos FROM
(
 SELECT  distinct(Instr('NNYNYY', 'Y', LEVEL)) Y_Pos
   FROM dual
 CONNECT BY LEVEL <= Length('NNYNYY') 
ORDER BY 1
)
/

SQL>

Y_POS
----------
Period1 3
Period1 5
Period1 6

答案 3 :(得分:0)

master..spt_values系统表的另一个选项

SELECT PERIOD, number
FROM dbo.test29 t
  JOIN master..spt_values v ON v.type = 'P' 
    AND SUBSTRING(DATESTRING, number, 1) = 'Y'