2010-04-15 31 views
5

Tôi đã có một vấn đề SQL nhỏ thú vị tuyệt vời để giải quyết hôm nay và nghĩ rằng tôi muốn yêu cầu cộng đồng xem bạn giải quyết những giải pháp nào.SQL xử lý rác trong trường số điện thoại

Chúng tôi có một email thực sự thú vị đối với dịch vụ văn bản mà chúng tôi sử dụng, bạn chỉ cần gửi email tới [email protected] và nó sẽ gửi tin nhắn văn bản tới số điện thoại bạn muốn.

Ví dụ để gửi văn bản đến 0790 0006006, bạn cần gửi email đến [email protected], khá gọn gàng huh?

Sự cố xảy ra với số điện thoại trong cơ sở dữ liệu của chúng tôi. Hầu hết các số điện thoại là tốt, nhưng một số trong số họ có "rác" trộn lẫn với số điện thoại.

Thực hiện các ví dụ tuyệt vời của rác, bạn cần để đối phó với (Tôi đã ẩn danh số điện thoại bằng cách đặt zero in):

07800 000647 (di động)
07.500 000.189 SỬ DỤNG 1ST
SEE GHI CHÚ
07900 000415 HỒ CHỈ
thử 1st 0770 0.000.694 sau đó nhà
07500 000465 không thể

Yêu cầu

Giải pháp cần phải có trong SQL (dành cho máy chủ MS SQL).

Vì vậy, thử thách là như sau, chúng tôi cần lấy số điện thoại không có khoảng trắng và không có bất kỳ rác nào được nhìn thấy trong các mẫu.

Ví dụ:

này:

thử 1st 0770 0.000.694 sau đó nhà

nên trở thành này:

Mọi thứ không có số điện thoại trong đó (ví dụ: "SEE NOTES") phải là null.

UPDATE:

Cám ơn các câu trả lời tuyệt vời! Chúng tôi đã có một số câu trả lời thú vị, nhưng nhìn thấy không có câu trả lời SQL nào có bất kỳ phiếu bầu nào, thật khó để chọn một câu trả lời yêu thích. Tôi đã thà nhìn thấy một yêu thích rõ ràng được chọn bởi cộng đồng.

Tôi sẽ để câu hỏi này trưởng thành hơn một chút và xem liệu có bất kỳ phiếu bầu nào đến trước khi tôi đưa ra câu trả lời hay không.

+0

Tại sao các downvotes? Đây là một câu hỏi lập trình để giải quyết một vấn đề mà tôi cần phải giải quyết hôm nay. Hãy bình luận nếu bạn downvote. –

Trả lời

2

Giả sử rằng điện thoại yopur luôn bắt đầu với '07' và chiều dài là 12 ký tự mà bạn có thể thử một cái gì đó như thế này:

DECLARE @Number varchar(50) 

--SET @Number='07800 000647(mobile)' 
--SET @Number='07500 000189 USE 1ST' 
--SET @Number='SEE NOTES' 
--SET @Number='07900 000415 HO ONLY' 
--SET @Number='try 1st 0770 0000694 then home' 
SET @Number='07500 000465 Cannot ' 



SELECT REPLACE(SUBSTRING(@Number, case when CHARINDEX ('07',@Number) =0 then Null 
else CHARINDEX ('07',@Number)end , 12),' ','') 

Trước hết, việc tìm kiếm điểm khởi đầu của '07' chuỗi, sau đó , nếu nó là 0 ('SEE NOTES'), trả về Null. Sau đó, lấy 12 ký tự của số. Cuối cùng, thay thế các khoảng trắng ...

+0

Tôi thích giải pháp này, mặc dù bạn giả định rằng số lượng sẽ luôn có khoảng trống. Tôi cho rằng tôi không đặt một exaple không có khoảng trắng trong dữ liệu mẫu của tôi, vì vậy tôi không thể làm được! ;-) Nó có thể dễ dàng được sửa chữa bằng cách thay thế đầu tiên và giả sử chiều dài là 11 thay thế. –

0

Dựa trên mẫu của bạn, có vẻ như hầu hết các phần bạn chỉ cần loại bỏ bất kỳ ký tự không phải số và khoảng trắng nào khỏi chuỗi (tôi không nhớ hàm SQL cho điều này, nhưng nó không quan trọng). Ngoại lệ duy nhất là với những thứ như "1st" hoặc "2nd", và bạn có thể loại bỏ chúng trước khi loại bỏ các ký tự không phải số bằng một loạt các câu lệnh loại REPLACE('1ST','').

Có thể có nhiều tình huống kỳ lạ hơn trong dữ liệu của bạn nơi mọi người bao gồm các chữ số thực không thực sự là một phần của số điện thoại của họ. Tôi không chắc chắn làm thế nào bạn tìm thấy và sửa chữa tất cả những điều này, khác hơn là chỉ cần đối phó với họ bất cứ khi nào bạn xảy ra để phát hiện ra chúng.

Có rất nhiều thành phần của bên thứ ba xử lý phân tích cú pháp số điện thoại, nhưng tôi không biết liệu có thể sử dụng bất kỳ phần tử nào trực tiếp từ SQL Server hay không. Có lẽ một số người trong số họ có thể, tùy thuộc vào phiên bản của SQL Server. Tìm kiếm của Google về "phân tích cú pháp số điện thoại trong SQL Server" cung cấp một loạt các tùy chọn.

0

DECLARE @test varchar (100)
DECLARE @result varchar (100)
SET @ test = '07.800 000.647 (di động)

SET @ result = ''
CHỌN
@result = @ kết quả + CASE KHI số LIKE '[0-9]' THEN ELSE số '' END TỪ
(
CHỌN sUBSTRING (@ kiểm tra, số, 1) AS số TỪ
(
CHỌN sỐ TỪ Thạc sĩ. .spt_valu es ĐÂU type = 'p' VÀ số giữa 1 và len (@test)
) AS tạm
) AS tạm
CHỌN @result

Như MusicGenesis nói mặc dù, bạn phải đối phó với bất cứ điều gì giống như 1 và 2 riêng biệt.

0

Hình như bạn có thể bước cùng tìm kiếm chuỗi liền kề số dài: (nhanh & bẩn)

CREATE FUNCTION fnRipMsisdn(@STRING VARCHAR(28)) RETURNS VARCHAR(28) AS 
BEGIN 
DECLARE @I INT, @RESULT VARCHAR(28), @CHAR CHAR, @CONCURRENT_ALPHA INT 
SET @I = 0 
SET @RESULT = '' 
SET @CONCURRENT_ALPHA = 0 
SET @STRING = REPLACE(@STRING, ' ', '') --replace chars that can delimit an msisdn 

WHILE @I < LEN(@STRING) BEGIN 
    IF LEN(@RESULT) >= 13 --MAX LEN 
     BREAK 
    SET @I = @I + 1 
    SET @CHAR = SUBSTRING(@STRING, @I, 1) 
    IF @CHAR LIKE '[0-9]' AND @CONCURRENT_ALPHA < 1 BEGIN 
     SET @CONCURRENT_ALPHA = 0 
     SET @RESULT = @RESULT + @CHAR 
    END ELSE BEGIN 
     SET @CONCURRENT_ALPHA = @CONCURRENT_ALPHA + 1 
     IF LEN(@RESULT) <= 9 BEGIN --MIN LEN 
      SET @RESULT = '' 
     END 
    END 
END 
RETURN CASE WHEN @RESULT = '' THEN NULL ELSE @RESULT END 
END 

select dbo.fnRipMsisdn('07800 000647(mobile)') 
select dbo.fnRipMsisdn('07500 000189 USE 1ST') 
select dbo.fnRipMsisdn('SEE NOTES') 
select dbo.fnRipMsisdn('07900 000415 HO ONLY') 
select dbo.fnRipMsisdn('try 1st 0770 0000694 then home') 
select dbo.fnRipMsisdn('07500 000465 Cannot') 

07800000647 
07500000189 
NULL 
07900000415 
07700000694 
07500000465 
0

Các giải pháp tôi đã đưa ra cho đến nay như sau:

SELECT 
CASE WHEN ISNUMERIC(SUBSTRING(REPLACE(MobilePhone, ' ', ''), 1, 11)) = 1 
THEN SUBSTRING(REPLACE(MobilePhone, ' ', ''), 1, 11) + '@emailservice.com' 
ELSE NULL END AS EmailToTextAddress 
FROM Contacts 

Tuy nhiên, điều này sẽ không đối phó với rác khi bắt đầu số điện thoại.

Nó cũng giả định rằng một số điện thoại (không có khoảng trắng) dài 11 ký tự, cho phép tôi xử lý các số charecters không phải là một phần của số điện thoại (như trong câu trả lời của MusiGenesis).

+0

Hãy cẩn thận với ISNumeric, nó cũng sẽ trả lại 1 cho các ký hiệu tiền tệ hợp lệ. Danh sách các biểu tượng đó là http://msdn.microsoft.com/en-us/library/ms188688.aspx – Jon

+0

Cảm ơn Jon, điều đó rất thú vị. –

+0

Bạn có thể gặp vấn đề với ký hiệu tiền tệ bằng cách thêm .0e0 vào số điện thoại trước khi thực hiện ISNUMERIC. –

1

Đặt cược tốt nhất của bạn là sửa dữ liệu. Nếu bạn không thể sửa dữ liệu, hãy đặt vào trường được tính toán mới để loại bỏ các ký tự bạn không muốn. Trong bất kỳ sự kiện bắt đầu ngay bây giờ để đặt điều khiển trên lĩnh vực nhập dữ liệu inthat trong applciation của bạn. Bạn không thành thật muốn lãng phí sức mạnh xử lý làm loại thao tác dữ liệu này với mỗi truy vấn làm điều đó một khi đã nhập dat và được thực hiện với nó.

+0

Tôi hoàn toàn đồng ý với bạn. May mắn thay đây là một truy vấn một ngày hôm nay, chúng tôi sẽ không thường xuyên thực hiện loại báo cáo này. Dữ liệu này là từ một hệ thống kế thừa mà chúng tôi đang di chuyển ra khỏi đó. Việc xác thực dữ liệu của chúng tôi tốt hơn nhiều trong hệ thống mới, chúng tôi sẽ không gặp phải vấn đề này. –

Các vấn đề liên quan