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。在这种特殊情况下,有几种不同类型的后空翻将非常有用
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)”导致了错误,这不是真正的解决方案,只是测试代码。