仅对SQL中的数值将子字符串强制转换为int
我有一个疑问:仅对SQL中的数值将子字符串强制转换为int,sql,sql-server,Sql,Sql Server,我有一个疑问: SUBSTRING ( dbo.Table.RNumber, 1, CHARINDEX( '+', dbo.Table.RNumber ) - 1 ) AS RoomNumber, SUBSTRING ( dbo.Table.R.Number, CHARINDEX( '+', dbo.Table.R.Number ) + 1, LEN(
SUBSTRING (
dbo.Table.RNumber,
1,
CHARINDEX(
'+',
dbo.Table.RNumber
) - 1
) AS RoomNumber,
SUBSTRING (
dbo.Table.R.Number,
CHARINDEX(
'+',
dbo.Table.R.Number
) + 1,
LEN(
dbo.Table.R.Number
)
) AS HallNumber,
我的表RNumber大部分类似于2+3或3+5,但有时类似于x+5或y+0。我想将字段转换为int,但我想将“x”或“y”之类的字符串转换为0。我用谷歌搜索了一下,但找不到解决办法。我该怎么做?谢谢。也许您可以使用ParseName()并尝试转换() 返回
SomeField RoomNumber HallNumber
2+3 2 3
3+5 3 5
x+5 0 5
y+0 0 0
也许您可以使用ParseName()并尝试_Convert() 返回
SomeField RoomNumber HallNumber
2+3 2 3
3+5 3 5
x+5 0 5
y+0 0 0
对于2012年之前的版本,您可以这样做:
CASE
WHEN NOT columnName like '%[^0-9]%' -- Contains no non-digits
AND columnName like '%[0-9]%' -- contains at least one digit
THEN CAST(columnName as INT) ELSE NULL
END
(请注意,这将拒绝负数,但如果需要支持负数,您可以轻松调整)
或者使用IsNumeric
,您必须首先强制转换为float
,因为IsNumeric
接受一些cast(表达式为INT)
不接受的字符串:
CASE WHEN ISNUMERIC(columnName)=1
THEN CAST(CAST(columnName as float) as int) END
对于2012年之前的版本,您可以这样做:
CASE
WHEN NOT columnName like '%[^0-9]%' -- Contains no non-digits
AND columnName like '%[0-9]%' -- contains at least one digit
THEN CAST(columnName as INT) ELSE NULL
END
(请注意,这将拒绝负数,但如果需要支持负数,您可以轻松调整)
或者使用IsNumeric
,您必须首先强制转换为float
,因为IsNumeric
接受一些cast(表达式为INT)
不接受的字符串:
CASE WHEN ISNUMERIC(columnName)=1
THEN CAST(CAST(columnName as float) as int) END
您可以使用case语句尝试以下操作 编辑为使用isnumeric()方法
CASE
WHEN isnumeric(SUBSTRING(dbo.Table.RNumber,1,CHARINDEX('+',dbo.Table.RNumber) - 1)) = 1
THEN SUBSTRING(dbo.Table.RNumber,1,CHARINDEX('+',dbo.Table.RNumber) - 1)
else 0
end AS RoomNumber,
CASE
WHEN isnumeric(SUBSTRING(dbo.Table.R.Number,CHARINDEX('+',dbo.Table.RNumber) + 1,LEN(dbo.Table.R.Number))) = 1
THEN SUBSTRING(dbo.Table.R.Number,CHARINDEX('+',dbo.Table.RNumber) + 1,LEN(dbo.Table.R.Number))
else 0
end AS HallNumber,
希望这能解决您的问题您可以使用case语句试试这个 编辑为使用isnumeric()方法
CASE
WHEN isnumeric(SUBSTRING(dbo.Table.RNumber,1,CHARINDEX('+',dbo.Table.RNumber) - 1)) = 1
THEN SUBSTRING(dbo.Table.RNumber,1,CHARINDEX('+',dbo.Table.RNumber) - 1)
else 0
end AS RoomNumber,
CASE
WHEN isnumeric(SUBSTRING(dbo.Table.R.Number,CHARINDEX('+',dbo.Table.RNumber) + 1,LEN(dbo.Table.R.Number))) = 1
THEN SUBSTRING(dbo.Table.R.Number,CHARINDEX('+',dbo.Table.RNumber) + 1,LEN(dbo.Table.R.Number))
else 0
end AS HallNumber,
希望这能解决您的问题请提供样本数据和表格schema@viki888我提供了示例数据,dbo.Table.RNumber是类似于
1+2
或x+5
的字符串,我希望获得数值,如果没有数值,则为0。这就是为什么我想知道您是否可以使用动态sql并让解析器将字符串解释为值。例如,选择(5+3)作为最终值。请提供样本数据和表格schema@viki888我提供了示例数据,dbo.Table.RNumber是类似于1+2
或x+5
的字符串,我希望获得数值,如果没有数值,则为0。这就是为什么我想知道您是否可以使用动态sql并让解析器将字符串解释为值。例如,选择(5+3)作为最终值。是否有使用IsNumeric方法的选项?我的老板不喜欢正则表达式。IsNumeric会同意,例如“1e-10”,但CAST不会喜欢。这些不是完整的正则表达式,它们是“模式”。性能非常好。如果您提供的是数字版本,我将非常高兴。。。非常感谢。是否有使用IsNumeric方法的选项?我的老板不喜欢正则表达式。IsNumeric会同意,例如“1e-10”,但CAST不会喜欢。这些不是完整的正则表达式,它们是“模式”。性能非常好。如果您提供的是数字版本,我将非常高兴。。。非常感谢。是否有使用IsNumeric方法的选项?我的老板不喜欢正则表达式。我已修改为使用isnumeric()函数。是否有使用isnumeric方法的选项?我的老板不喜欢正则表达式。我已修改为使用isnumeric()函数