我有这个问题:
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 :(得分:2)
你可以使用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,
希望这可以解决您的问题
答案 1 :(得分:1)
也许您可以使用ParseName()和Try_Convert()
Declare @YourTable table (SomeField varchar(50))
Insert Into @YourTable values
('2+3'),('3+5'),('x+5'),('y+0')
Select *
,RoomNumber = IsNull(Try_Convert(int,ParseName(Replace(SomeField,'+','.'),2)),0)
,HallNumber = IsNull(Try_Convert(int,ParseName(Replace(SomeField,'+','.'),1)),0)
From @YourTable
返回
SomeField RoomNumber HallNumber
2+3 2 3
3+5 3 5
x+5 0 5
y+0 0 0
答案 2 :(得分:1)
对于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(EXPRESSION as INT)
不接受的某些字符串:
CASE WHEN ISNUMERIC(columnName)=1
THEN CAST(CAST(columnName as float) as int) END