2010-01-22 83 views
1

我使用地址字段中的门牌号构建散列。我可以使用什么SQL从varchar字段的前面仅选择数字字符?从SQL中的varchar列获取前n个数字字符

EX:

12345 South 1st Street 

我想12345。提前致谢。

+0

SQL Server和T-SQL不擅长字符串操作,特别是当它进入正则表达式区域时。你可以用C#编写这段代码,并将其作为一个CLR程序集部署到SQL Server中,否则,恐怕很难找到合适的解决方案。 – 2010-01-22 15:39:48

+1

一旦你有正则表达式的支持,你可以使用'^ \ d +'。请参阅:http://msdn.microsoft.com/en-us/magazine/cc163473.aspx – 2010-01-22 15:47:11

回答

2
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 
+0

增加了一些更强大的示例。 – RedFilter 2010-01-22 16:19:17

+0

增加了复选标记 – 2010-01-22 17:30:32

0

你认为会有数字字符后面输入一个空格,而且总是会有数字字符?如果该值包含空格,或者是空

DECLARE @addr VARCHAR(100) 
SET @addr='12345 South 1st St' 
SELECT SUBSTRING(@addr,0,CHARINDEX(' ',@addr)) 
0
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 
0
SELECT LEFT(address, INSTR(address, ' ') - 1) FROM address_table 

它找到的第一个空间的位置,并抓住了左边的文字。

相关问题