我有一个包含数据类型varchar
的列policy_datePolicy_date
-----------
A1999062
20010405
我想用更新数据 case isnnmeric(policy_date)= 0然后修剪字母表(1999062)并检查len是否小于8然后将其设为NULL否则为Policy_date。
注意:我必须将日期字段转换为date
数据类型而不是varchar
。
我的出局看起来应该是这样的:
Policy_Date
-----------
NULL
2001-04-05
任何人都可以编写sql case语句。 谢谢, Swathi。
答案 0 :(得分:2)
根据您的评论,您只想删除第一个字符位置(如果它是alpha)。这消除了对函数/ CLR调用的需要。如果此要求发生变化,您将需要创建一个剥离字符的函数,但查询的其余部分将起作用。
Create Table #Test (PolicyDate Varchar(8000))
Insert #Test Values ('A19990602')
Insert #Test Values ('A1999062')
Insert #Test Values ('20010405')
Select Convert(Date,
Case When IsNumeric(PolicyDate) = 0 Then
Case When Len(PolicyDate) < 9 Then Null
Else Right(PolicyDate, Len(PolicyDate) -1) End
Else PolicyDate
End) PolicyDate2
From #Test
示例功能,有许多主题可用,哪种方法更快。
CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
WHILE PATINDEX('%[^0-9]%', @strText) > 0
BEGIN
SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')
END
RETURN @strText
END
PS。我使用了IsNumeric(),因为这就是你所说的你想要实现的东西。但请注意,通过设计可以包含certian字符,并且仍然具有函数return,它是一个数字。 IsNumeric($1,230.54)
将返回1.如果这是一个问题,那么请使用替代方案,例如TRY_PARSE(PolicyDate as int)
用于sql2012及更高版本。
答案 1 :(得分:0)
您可以使用最右边的8个字符,使用stuff()
注入两个连字符,并检查这是否是isdate()
的有效日期。如果是,请重复相同操作并使用cast()
进行转换:
select case when len(policy_date) >= 8
and isdate(stuff(stuff(right(policy_date, 8), 7, '-'), 5, '-')) then
cast(stuff(stuff(right(policy_date, 8), 7, '-'), 5, '-') as datetime)
end