Sql 拆分和分析数据

Sql 拆分和分析数据,sql,tsql,Sql,Tsql,我有一个字段,有时包含如下字符串:2/23/2013 12:25:55~45 我需要在~处拆分字符串,并确定~左侧的值是否为有效的日期时间值,~右侧的值是否为有效的整数。基本上,我想要返回的是一个真/假,无论这些条件是否正确 请记住,该字段可以包含null,可以包含任何其他类型的数据,也可以包含多个tilde。在所有情况下,我都需要返回false。我唯一需要返回true的时间是当字段包含日期/时间值、单个波浪号和整数时。在SQL Server中,可以执行以下操作: select (case wh

我有一个字段,有时包含如下字符串:
2/23/2013 12:25:55~45

我需要在~处拆分字符串,并确定~左侧的值是否为有效的日期时间值,~右侧的值是否为有效的整数。基本上,我想要返回的是一个真/假,无论这些条件是否正确


请记住,该字段可以包含null,可以包含任何其他类型的数据,也可以包含多个tilde。在所有情况下,我都需要返回false。我唯一需要返回true的时间是当字段包含日期/时间值、单个波浪号和整数时。

在SQL Server中,可以执行以下操作:

select (case when col like '%~%'
             then (case when isdate(left(col, charindex('~', col) - 1)) = 1 and
                             isnumeric(substring(col, charindex('~', col)+1, 1000)) = 1 and col not like '%~%.%' and col not like '%~%e%'
                        then 1
                        else 0
                   end)
             else 0
       end) as IsFunkyFormat, substring(col, charindex('~', col)+1, 1000), left(col, charindex('~', col) - 1)

嵌套的大小写是为了防止在找不到分隔符时出错。
not like
表达式旨在排除非整数的数字格式。

这个问题比它看起来更棘手,因为它很容易出错,或者以这样一种方式编写,即它现在对给定的数据集有效,但对其他数据集无效

如果这是存储在数据库中的数据,我强烈建议您学习数据库规范化。规范化的一个原则是在一列中只存储一个值。在本例中,您将在同一列中存储datetime和整数值。最好将数据存储在多个列中

也就是说,我知道有时会给您一些需要导入数据库的原始数据。通常情况下,我们无法控制提供给我们的原始数据,因此必须使用SQL。在这种特殊情况下,有几种不同类型的后空翻将非常有用

  • 确定字符串中的~个字符数
  • 拆分平铺上的数据
  • 确保其中一个值是datetime
  • 确保另一个值是整数
  • SQL Server只内置了4项中的1项。有一个函数名为IsDate,它接受一个字符串参数并返回一个位,指示字符串表示的日期是否可以转换为日期

    要确定字符串中~的数量,诀窍是确定带波浪线的字符串的长度,以及不带波浪线的字符串的长度。我们可以通过执行以下操作来确定哪些行包含单个瓷砖:

    When Len(Data) = Len(Replace(Data, '~', '')) + 1
    
    另一个需要解决的棘手问题是确定字符串是否表示整数。有多种方法可以做到这一点,但我最喜欢的方法是将硬编码值连接到数据,然后测试数值。例如,IsNumeric函数将为字符串1e4返回true,因为e表示科学符号,1e4可以解释为1000。因此,如果您这样做:

    IsNumeric(Data + 'e0')
    
    对于科学记数法,这将返回false,因为数据类似于1e4,它连接到“e0”以获得非数字的“1e4e0”。类似地,我们可以将.0连接到字符串以检查小数。如果您的数据是45.2(数字),并且您将.0连接到该数据,则会得到非数字的“45.2.0”。您还可以在测试中添加“-”以检查正数-20'是数字,但'-'+'-20'(即'--20')不是数字

    Select  YourColumnHere, 
            Len(Replace(YourColumnHere, '~', '')) + 1,
            Case When Len(YourColumnHere) = Len(Replace(YourColumnHere, '~', '')) + 1
                 Then 
                        Case When IsDate(Left(YourColumnHere, CharIndex('~', YourColumnHere)-1)) = 1
                             Then 
                                    Case When Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) > ''
                                         Then IsNumeric('-' + Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) + '.0e0')
                                         Else 0 
                                         End
                             Else 0
                             End
                 Else 0
                 End
    From    YourTableNameHere
    

    可以还有?什么版本的sql server?用谷歌快速搜索T-SQl字符串函数和T-SQl日期函数,现在就可以完成了。我也在研究这个问题的答案。我刚刚测试了您的解决方案,注意到如果输入字符串是单个空格或空字符串,则会出现错误。@GMastros。当我测试这些值时,它正确地返回“0”。对于
    “~”
    ,它也返回零,所以我不知道你指的是什么。我很抱歉。正是这个“left(Data,charindex(“~”,Data)-1)”导致了错误,这不是真正的解决方案,只是测试代码。