代码之家  ›  专栏  ›  技术社区  ›  AskMe

基于条件的字符串拆分

  •  2
  • AskMe  · 技术社区  · 8 年前

    我很少有这样的数字串;大约有3000条记录。

                Column
                ------------
                Cell 233567-3455
                Cell123-4567
                Cell#123-7449
                Local 456-0987
                1 616 468-7796
                1234567-5x2345
                234/625-1234
                (C)755-7442
                5732878-2
                5721899-23
                6712909-3
                7894200-234
                2144-57238
                5673893/588218
                437-4737-5772
    

    如何查找以下记录:

                Column
                -------------
                5732878-2
                5721899-23
                6712909-3
                7894200-234
    

    一旦我找到这个,我需要把它们分成两部分

                1st Column.    |  2nd column
                -------------  |
                5732878        |   5732872      
                5721899        |   5721823
                6712909        |   6712903
                7894200        |   7894234
    

    我尝试使用PARINDEX和CHARINDEX修复此问题 但不知何故,它不起作用。请帮忙。

    4 回复  |  直到 8 年前
        1
  •  1
  •   dfundako    8 年前

    我不知道你的过滤逻辑,以获得你的中间集,但这应该得到你预期的最终结果集。我假设您只需要连字符左侧的字符串长度大于右侧的长度的记录,也不需要连字符超过1的记录。

    SELECT LEFT(telephone, CHARINDEX('-', telephone)-1) AS [1stTelephone],
    STUFF(
    --get the string before the hyphen
    LEFT(telephone, CHARINDEX('-', telephone)-1), 
    --get the starting location of chars we are going to replace
    LEN(LEFT(telephone, CHARINDEX('-', telephone)))-LEN(RIGHT(telephone, CHARINDEX('-', REVERSE(telephone))-1)), 
    --get the length of the section we are replacing
    LEN(RIGHT(telephone, CHARINDEX('-', REVERSE(telephone))-1)),
    --replace that section with the string after the hyphen
    RIGHT(telephone, CHARINDEX('-', REVERSE(telephone))-1)
    ) AS [2nd telephone]
    
    FROM your_table
    
    WHERE LEN(LEFT(telephone, CHARINDEX('-', telephone))) > LEN(RIGHT(telephone, CHARINDEX('-', REVERSE(telephone))))
    AND len(telephone) - len(REPLACE(telephone, '-', '')) = 1
    
        2
  •  0
  •   Katerine459    8 年前

    有点脏的方法(专门查找7位数字,后跟连字符,后跟任意数字):

    SELECT BasePhone AS Phone1, LEFT(BasePhone, 7-LEN(OtherPhoneEnd)) + OtherPhoneEnd AS Phone2
    FROM (
        SELECT LEFT(Telephone, 7) AS BasePhone, SUBSTRING(Telephone,9,7) AS OtherPhoneEnd 
        FROM Telephones 
        WHERE Telephone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]-%'
        )
    
        3
  •  0
  •   Michał Turczyn    8 年前

    根据您提供的信息,我假设您需要在第8位使用连字符(-)的数字。尝试以下操作:

    create table #TelNo (
        Tel varchar(30)
    )
    
    insert #TelNo(Tel)
    values ('5732878-2'),
    ('5721899-23'),
    ('6712909-3'),
    ('7894200-234'),
    ('2144-57238'),
    ('5673893/588218'),
    ('437-4737-5772')
    
    select Tel, LEFT(Tel, Len(tel) - len(suffix)) + suffix [SecondTel] from (
        select substring(Tel, 1, 7) [Tel], substring(Tel, 9, 10) [suffix] from #TelNo
        where CHARINDEX('-', Tel) = 8
    )a 
    
        4
  •  0
  •   MJH    8 年前

    您可以使用以下内容:

    DDL公司

    use tempdb
    
    create table TelNo (
        Tel varchar(30)
    )
    
    insert TelNo(Tel)
    values ('5732878-2'),
    ('5721899-23'),
    ('6712909-3'),
    ('7894200-234'),
    ('2144-57238'),
    ('5673893/588218'),
    ('437-4737-5772')
    

    密码

    select Tel,
        case 
            when Tel like '%_-[0-9]' then left(Tel, len(Tel)-2) 
            when Tel like '%__-[0-9][0-9]' then left(Tel, len(Tel)-3) 
            when Tel like '%___-[0-9][0-9][0-9]' then left(Tel, len(Tel)-4) 
            else Tel 
        end Tel1,
        case 
            when Tel like '%_-[0-9]' then left(Tel, len(Tel)-3) + right(Tel, 1)
            when Tel like '%__-[0-9][0-9]' then left(Tel, len(Tel)-5) + right(Tel, 2)
            when Tel like '%___-[0-9][0-9][0-9]' then left(Tel, len(Tel)-7) + right(Tel, 3)
            else NULL 
        end Tel2
    from TelNo
    
    推荐文章