我有一个大型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函数的长度参数无效。
答案 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 ;