代码之家  ›  专栏  ›  技术社区  ›  Chris McCall

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

  •  1
  • Chris McCall  · 技术社区  · 15 年前

    我正在用地址栏中的门牌号建立一个哈希表。我可以使用什么SQL只从varchar字段前面选择数字字符?

    前任:

    12345 South 1st Street
    

    我想要 12345 . 事先谢谢。

    4 回复  |  直到 15 年前
        1
  •  2
  •   D'Arcy Rittich    15 年前
    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
    
        2
  •  0
  •   csm8118    15 年前

    您认为数字字符后面会有一个空格,并且总是有数字字符吗?

    DECLARE @addr VARCHAR(100)
    SET @addr='12345 South 1st St'
    SELECT SUBSTRING(@addr,0,CHARINDEX(' ',@addr))
    
        3
  •  0
  •   Veger    15 年前
    SELECT LEFT(address, INSTR(address, ' ') - 1) FROM address_table
    

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

        4
  •  0
  •   AdaTheDev    15 年前
    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公寓,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
    
    推荐文章