Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中将字符串转换为位置列表?_Sql_Sql Server 2005 - Fatal编程技术网

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

如何在SQL中将字符串转换为位置列表?,sql,sql-server-2005,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” 我需要将其转换为一个表,该表在一列中包含句点,在下一列中包含Y的位置: PERIOD WE

我目前有数据存储与命名时段相关联的周数,如下所示,在一个包含PERIOD和DATESTRING列的表中

PERIOD  DATESTRING
Period1 NNYNYY    //The position of 'Y' indicates a yes, 'N' indicates no
Period2 NNNNNY
...
因此,由于第3周是时段1的一部分,因此该时段的日期字符串中第3位有一个“Y”

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

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

可以通过连接到数字表并使用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';
这使用递归查询来构建数字表


我在SQLServer2008上构建并测试了它,但我认为在2005年这样做不应该是一个问题。您最多只能对其进行调整。

这里有另一种使用“查找Y”的方法:


这里有一些想法给你。这是Oracle查询,但我认为它应该适用于任何SQL,或者您可以将其修复为适用于SQL Srv 2005。使用的所有函数均为ANSI SQL标准。我不确定是否有2005年的水平…:

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

主..spt_值系统表的另一个选项

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

什么数据库?这相当依赖于这些信息。另外,这个日期字符串可以有多长?对于短字符串,可以使用相当简单的解决方案,但对于长字符串,则需要另一种解决方案。datestring的长度只能为52个字符。如果可以,您确实应该更改表设计。将多个数据项编码为一列值几乎总是一个坏主意。这是试图从第三方解决方案获取合理报告的一部分。无法改变设计,只需编写复杂的查询来获得我们想要的结果,我目前正被他们使用的周数编码方案绊倒。感谢一百万——这是一个相对简单的小项目中剩下的一个障碍。+1。由于不是SQL Server用户,我不知道charindex函数。SQL Server不理解| | |、dual或connect by。这是Oracle的递归CTE等价物。@mellamokb,谢谢分享。我对SQL Server了解不多。我希望有一个等价于| |-串联以及连接方式,级别。。。dual只是一个即使在Access中也可以使用的表。但任何其他表格都可以在适当的位置使用。
SELECT PERIOD, number
FROM dbo.test29 t
  JOIN master..spt_values v ON v.type = 'P' 
    AND SUBSTRING(DATESTRING, number, 1) = 'Y'