id Mobile Home Business
1 07707 0161 abcdefg
2 Null 07798567 Null
3 07709 078 iju Null
您好。我试图找出如何从表中检索手机号码,其中包含一些不良数据。
该数字可以位于所有varchars的列中。 要搜索的号码必须从07开始,且必须是11位数。
到目前为止,我只管理过这个:
select REPLACE (
COALESCE (Business_Phone, Cell_Phone, Home_Phone) Contact_Phone
, ' '.'')
from testtable
where len () =11?
任何建议都将不胜感激。感谢。
答案 0 :(得分:0)
尝试此查询:
SELECT * FROM (
SELECT CASE
WHEN REPLACE(Business_Phone, ' ', '') LIKE '07[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' THEN REPLACE(Business_Phone, ' ', '')
WHEN REPLACE(Cell_Phone, ' ', '') LIKE '07[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' THEN REPLACE(Cell_Phone, ' ', '')
WHEN REPLACE(Home_Phone, ' ', '') LIKE '07[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' THEN REPLACE(Home_Phone, ' ', '')
END AS TrueMobile
FROM testtable
) x
WHERE x.TrueMobile IS NOT NULL
它试图找到一个包含11位数字的字段(前两个是07),中间有任意数量的空格,没有其他字符。它首先尝试Business_Phone
,然后是Cell_Phone
,然后是Home_Phone
。记录这三个字段都不匹配的记录将从结果集中排除。
答案 1 :(得分:0)
DECLARE @TABLE TABLE (id INT, Mobile VARCHAR(20), Home VARCHAR(20),Business VARCHAR(20))
INSERT INTO @TABLE VALUES
(1,'07707' , '0161' , 'abcdefg'),
(2,Null , '07798567', Null),
(3,'07709' , '078 iju' , '07709175555'),
(4,'07709178921', '078 iju' , Null)
;WITH CTE AS
(
SELECT *
FROM @TABLE
UNPIVOT (Numbers FOR Num_Types IN (Mobile,Home,Business)) up
)
SELECT *
FROM CTE C1
WHERE NOT EXISTS(SELECT 1
FROM CTE C2
WHERE LEFT(C2.Numbers, 2) = '07'
AND C2.Numbers NOT LIKE '%[^0-9]%'
AND C1.id = C2.id
AND C1.Numbers = C2.Numbers
AND C1.Num_Types = C2.Num_Types)
╔════╦═════════╦═══════════╗
║ id ║ Numbers ║ Num_Types ║
╠════╬═════════╬═══════════╣
║ 1 ║ 0161 ║ Home ║
║ 1 ║ abcdefg ║ Business ║
║ 3 ║ 078 iju ║ Home ║
║ 4 ║ 078 iju ║ Home ║
╚════╩═════════╩═══════════╝