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

问题描述 投票:0回答:4

我的电话号码很少:

            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这样的记录。

sql-server sql-server-2016
4个回答
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]来表示任何数字。


0
投票

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

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

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

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

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) <> ''

0
投票

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

SELECT *
FROM teble1
WHERE
TELP LIKE '%[0-9]X[0-9]%';
© www.soinside.com 2019 - 2024. All rights reserved.