我使用地址字段中的门牌号构建散列。我可以使用什么SQL从varchar字段的前面仅选择数字字符?从SQL中的varchar列获取前n个数字字符
EX:
12345 South 1st Street
我想12345
。提前致谢。
我使用地址字段中的门牌号构建散列。我可以使用什么SQL从varchar字段的前面仅选择数字字符?从SQL中的varchar列获取前n个数字字符
EX:
12345 South 1st Street
我想12345
。提前致谢。
declare @MyColumn as varchar(250)
set @MyColumn = '12345 South 1st Street'
select @MyColumn, cast(left(@MyColumn, patindex('%[^0-9]%', @MyColumn)) as int)
如果你不知道会有肯定的数字,加CASE
声明如下,以防止错误:
declare @MyColumn as varchar(250)
set @MyColumn = 'South 1st Street'
select @MyColumn as Address, case when patindex('%[^0-9]%', @MyColumn) = 1 then '' else left(@MyColumn, patindex('%[^0-9]%', @MyColumn)) end as StreetNumber
如果有可能是前导空格,你可能还需要添加一个LTRIM
:
declare @MyColumn as varchar(250)
set @MyColumn = ' 12345 South 1st Street'
select @MyColumn as Address, case when patindex('%[^0-9]%', ltrim(@MyColumn)) = 1 then '' else left(ltrim(@MyColumn), patindex('%[^0-9]%', ltrim(@MyColumn))) end as StreetNumber
增加了一些更强大的示例。 – RedFilter 2010-01-22 16:19:17
增加了复选标记 – 2010-01-22 17:30:32
你认为会有数字字符后面输入一个空格,而且总是会有数字字符?如果该值不包含空格,或者是空
DECLARE @addr VARCHAR(100)
SET @addr='12345 South 1st St'
SELECT SUBSTRING(@addr,0,CHARINDEX(' ',@addr))
DECLARE @TestVal VARCHAR(100)
SET @TestVal = '12345 South 1st Street'
SELECT
CASE
WHEN @TestVal LIKE '% %' THEN LEFT(@TestVal , CHARINDEX(' ', @TestVal) - 1)
ELSE @TestVal
END
这也将正常工作。
如果您希望完全像您要求的那样(仅限字符串前面的数字字符),请尝试此操作。例如'MyHouseName,SomeStreet'会返回'',因为它没有门牌号码。 '12A Flat,SomeStreet'会返回'12'。这听起来并不理想,但可以明确地说“数字”字,我已经扩展到这个替代:
DECLARE @TestVal VARCHAR(100)
SET @TestVal = '12345 South 1st Street'
SELECT CASE
WHEN @TestVal LIKE '[0-9]%' THEN
CASE
WHEN @TestVal LIKE '%[^0-9]%' THEN LEFT(@TestVal, PATINDEX('%[^0-9]%', @TestVal) - 1)
ELSE @TestVal
END
ELSE '' END
SELECT LEFT(address, INSTR(address, ' ') - 1) FROM address_table
它找到的第一个空间的位置,并抓住了左边的文字。
SQL Server和T-SQL不擅长字符串操作,特别是当它进入正则表达式区域时。你可以用C#编写这段代码,并将其作为一个CLR程序集部署到SQL Server中,否则,恐怕很难找到合适的解决方案。 – 2010-01-22 15:39:48
一旦你有正则表达式的支持,你可以使用'^ \ d +'。请参阅:http://msdn.microsoft.com/en-us/magazine/cc163473.aspx – 2010-01-22 15:47:11