我的电话号码很少:
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这样的记录。
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]
来表示任何数字。
我认为简单的PATINDEX()
功能可以在这里获得rto电话号码
SELECT *
FROM table t
WHERE PATINDEX('%[0-9]X[^,]%', tele) > 0
为了只获得具有x前后数字的电话号码,格式可能会略有变化
PATINDEX('%[0-9]X[0-9]%', tele) > 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) <> ''
这将给出您要求的结果: -
SELECT *
FROM teble1
WHERE
TELP LIKE '%[0-9]X[0-9]%';