找到字段的len并在列中len小于8时更新字段

时间:2016-07-28 19:08:04

标签: sql sql-server

我有一个包含数据类型varchar

的列policy_date
Policy_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。

2 个答案:

答案 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