从SQL中的varchar列获取前n个数字字符

时间:2010-01-22 15:34:04

标签: sql-server-2005

我正在使用地址字段中的门牌号码构建哈希值。我可以用什么SQL来选择varchar字段前面的数字字符?

EX:

12345 South 1st Street

我想要12345。提前谢谢。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您是否认为数字字符后面会有空格,并且始终会有数字字符?

DECLARE @addr VARCHAR(100)
SET @addr='12345 South 1st St'
SELECT SUBSTRING(@addr,0,CHARINDEX(' ',@addr))

答案 2 :(得分: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

答案 3 :(得分:0)

SELECT LEFT(address, INSTR(address, ' ') - 1) FROM address_table

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