SQL使用Charindex选择子串

时间:2015-01-12 19:45:35

标签: sql

我有一个大型SQL表,其中包含ItemID列和Value列;列Value包含我想要提取的日期。

此查询正常工作并返回日期:

declare @Value varchar(255)
set @Value = 'Item-Id: 1243223  Date: 5 Oct 2003 1:14:53  From: xx@yahoo.com  To: yy@yahoo.com'
select substring(@Value,CharIndex(' Date: ',@Value) + 7,charindex(' From: ',@Value)-CharIndex(' Date: ',@Value) -7)

我的问题是:如何在不使用“声明”的情况下在整个表格上运行此查询?

类似的东西:

select substring(Value, CharIndex(' Date: ', Value) + 7, charindex(' From: ',Value)  - CharIndex(' Date: ', Value) - 7) 
from TableName 

如果我运行此查询,则会收到此错误:

  

传递给SUBSTRING函数的长度参数无效。

2 个答案:

答案 0 :(得分:0)

只需将 @Value 替换为 FieldName

select substring(FieldName,CharIndex(' Date: ',FieldName) + 7,charindex(' From: ',FieldName)-CharIndex(' Date: ',FieldName) -7)

FieldName 是列的名称。

这就是全部!

完整样本:

Declare @tmp TABLE (MyVal varchar(255))

INSERT INTO @tmp (MyVal)
VALUES('Item-Id: 1243223  Date: 5 Oct 2003 1:14:53  From: xx@yahoo.com  To: yy@yahoo.com'),
('Item-Id: 12432885  Date: 3 May 2004 12:14:53  From: xx@yahoo.com  To: yy@yahoo.com'),
(' ')

SELECT substring(MyVal,CharIndex(' Date: ',MyVal) + 7,charindex(' From: ',MyVal)-CharIndex(' Date: ',MyVal) -7) AS MyDate
FROM @tmp 
WHERE CharIndex(' Date: ',MyVal)>0 AND charindex(' From: ',MyVal)>0

答案 1 :(得分:0)

您的问题是您的字符串中的值并不都与您指定的格式匹配。您可以使用case语句来解决此问题。像这样:

select (case when value like '% Date: % From: %'
             then substring(Value, CharIndex(' Date: ', Value) + 7,
                            charindex(' From: ', Value) - CharIndex(' Date: ', Value) -7
                           )
        end)
from TableName ;