【问题标题】:find the len of the field and update the field if the len is less than 8 in the column查找字段的len,如果列中len小于8,则更新字段
【发布时间】:2016-07-28 19:08:04
【问题描述】:

我有一个数据类型为 varchar 的列 policy_date

Policy_date
-----------
A1999062
20010405

我想更新数据 isumeric(policy_date) = 0 的情况,然后修剪字母表 (1999062) 并检查 len 是否小于 8,然后将其设为 NULL,否则 Policy_date。

注意:我必须将日期字段转换为 date 数据类型,而不是 varchar。 我的输出应该是这样的:

Policy_Date
-----------
NULL
2001-04-05

任何人都可以编写 sql case 语句。 谢谢你, 斯瓦蒂。

【问题讨论】:

  • 我无法编写案例陈述,但这是我尝试过的.. select RIGHT([policy_date], LEN([policy_date]) - 1) AS MyTrimmedColumn FROM table where isnumeric ([policy_date] )= 0
  • 您使用的是哪个版本的 SQL Server?自 SQL Server 2012 以来添加了几个函数(TRY_PARSE、TRY_CONVERT 和 TRY_CAST),可用于帮助解决此问题。

标签: sql sql-server


【解决方案1】:

根据您的评论,如果它是 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() 是因为这就是您所说的想要实现的。但是请注意,根据设计,可以包含某些字符,并且仍然有函数返回它是一个数字。 IsNumeric($1,230.54) 将返回 1。如果这是一个问题,请使用替代方案,例如 TRY_PARSE(PolicyDate as int) 用于 sql2012 及更高版本。

【讨论】:

  • 请不要使用 ISNUMERIC()。选择 ISNUMERIC($)、ISNUMERIC('.')、ISNUMERIC(',')
  • Joe c - 我对您发送的 #Test 查询进行了小改动 Create Table #Test (PolicyDate Varchar(8000)) Insert #Test Values ('A19990602') Insert #Test Values ('A1999062' ) 插入 #Test 值 ('20010405') 选择 Convert(Date, Case When IsNumeric(PolicyDate) = 0 Then Case When Len(PolicyDate)
  • 如果类型是字符(varchar nvarchar char 等),则只能获取空字符串。如果是日期,那么您将获得默认值 1900-01-01
【解决方案2】:

您可以取最右边的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多