仅对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()函数