在字母表之前和之后只获取数字

时间:2018-03-01 06:30:25

标签: sql-server sql-server-2016

我的电话号码很少:

            Tele
            -----
            251510X25    
            364680X5 
            12345,X34
            12345X
            x57823889
            1234567X12/7
            1234567X,12/7

我想要只在X之前和之后获得具有数字的电话 我的输出应该是:

            Tele
            -----
            251510X25    
            364680X5 
            1234567X12/7

我写了这样一个查询:

            SELECT ID,TELP,
                 CASE 
                     WHEN PATINDEX('%[0-9]%', TELP) >0  THEN 
                         RTRIM(LEFT(TELP, PATINDEX('%[0-9]%', TELP)-1)) 
                     ELSE TELP 
                 END as TELP1
             FROM [teble1] where len(TELP) <=10 and PATINDEX('%[0-9]%', TELP) >0 
             and (TELP like '%x%' or TELP like '%/%')

我无法获得所需的输出。我有大约100k这样的记录。

4 个答案:

答案 0 :(得分:1)

LIKE运算符可以在这里工作:

SELECT *
FROM [teble1]
WHERE
    TELP LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9]X[0-9]%';

上述类似图案表示捕获任意七位数的数字,然后是X,之后至少跟一个数字。

SQL Server没有非常强大的正则表达式支持,但为了弥补这一点,他们增强了LIKE以支持一些基本的正则表达式模式匹配,例如[0-9]来表示任何数字。

答案 1 :(得分:0)

我认为简单的PATINDEX()功能可以在这里获得rto电话号码

SELECT * 
FROM table t
WHERE PATINDEX('%[0-9]X[^,]%', tele) > 0

为了只获得具有数字之前和之后的电话号码,然后格式可能会略有变化

PATINDEX('%[0-9]X[0-9]%', tele) > 0

答案 2 :(得分:0)

   ;WITH CTE AS
    (
        SELECT REPLACE(Tele,'/','') V, Tele , CHARINDEX('X',Tele,0) Ix
        FROM tableName 
    )
    SELECT Tele
    FROM CTE
    WHERE 
    TRY_CAST(SUBSTRING(V,0,Ix) AS BIGINT) IS NOT NULL AND SUBSTRING(V,0,Ix) <> '' 
    AND TRY_CAST(SUBSTRING(V,Ix+1,100) AS BIGINT) IS NOT NULL AND SUBSTRING(V,Ix+1,100) <> ''

答案 3 :(得分:0)

这将给出您要求的结果: -

SELECT *
FROM teble1
WHERE
TELP LIKE '%[0-9]X[0-9]%';