2015-04-14 3 views
0

Мне недавно была предоставлена ​​возможность работать, изучая SQL. У меня ограниченное знание синтаксиса и практики SQL.SQL, SQLYog - поиск номера номера телефона в столбце в

Как одна из моих первых задач на работе, я должен искать номера телефонов в строке текста, описывающей жилой комплекс. Причина в том, что мы взимаем плату за вставку контактной информации.

Хотя я написал запрос изолирующей только номера с SQLyog, я ищу, чтобы дополнительно отфильтровать + результаты 2k, изолируя случаи, когда у меня есть

1) 10 последовательных цифр без пробелов т.е. 6173274810

2) 10 последовательных цифр с кластером из 3 цифр, 3 цифры и 4 цифры с одним пробелом между , т. Е. 855 347 2501

3) 10 последовательных цифр с кластером из 3 цифр, 3 цифры и 4 цифры с большим количеством чем одно место между т.е. 622 257 2701

До сих пор это то, что я получил,

SELECT ac.complex_id, ac.comments, 
LENGTH(r.number_string) AS count_of_characters, r.number_string 
FROM aptcomplexes ac, manager_center_subscription mcs, 

    (SELECT complex_id, LENGTH(comments), comments, 
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    comments, '*', ''), '/',''), 'a', ''), 'b', ''), 'c', ''), 'd', ''), 'e', ''), 'f', ''), 'g', ''), 'h', ''), 'i', ''), 'j', ''), 'k', ''), 'l', ''), 'm', '') 
    , 'n', ''), 'o', ''), 'p', ''), 'q', ''), 'r', ''), 's', ''), 't', ''), 'u', ''), 'v', ''), 'w', ''), 'x', ''), 'y', ''), 'z', ''), '.', ''), ',', ''), "’", ''), 'A', ''), 'B', ''), 'C', ''), 'D', ''), 'E', ''), 
    'F', ''), 'G', ''), 'H', ''), 'I', ''), 'J', ''), 'K', ''), 'L', ''), 'M', ''), 'N', ''), 'O', ''), 'P', ''), 'Q', ''), 'R', ''), 'S', ''), 'T', ''), 'U', ''), 'V', ''), 'W', ''), "X", ''), 'Y', '') 
    , 'Z', ''), '!', ''), "?", ''), '$', ''), 'Z', ''), '-', ''), '(', ''), ')', ''), "&", ''), '*', ''), ':', ''), '"', ''), ';', ''), '@', ''), '|', ''), ';', ''),"\\", ''), '+', ''), '[', ''),"]" , ''),"â" , '') 
    , "'", ''),"#" , ''),"=" , ''), "¦", ''), "\n", ''), "½", ''), "½", ''), "©", ''), "Ã", ''), "¿", ''), "ï", ''), "%", ''), "Â", ''), "¼", ''), "¡", ''), "³", ''), "¢", ''), "€", ''), "”", '') 
    , "_", '') , "‚", '') , "~", '') , "<", '') , ">", '') , "~", ''), "–", '') , "‘", ''), CHAR(10),''), CHAR(9),''), CHAR(13),''), '™',''), 'œ',''), '®','') AS number_string 
    FROM aptcomplexes 
    GROUP BY complex_id 
    ) r 

WHERE 
ac.complex_id = mcs.complex_id 
AND ac.complex_id = r.complex_id 
AND LENGTH(r.number_string)>=10 
AND mcs.subscription_status='Active' 
AND mcs.product_id=1 
GROUP BY ac.complex_id 
ORDER BY LENGTH(r.number_string) DESC 
; 

Я посмотрел по всему сайту, но не имел успеха найти то, что я действительно искал. У меня такое чувство, что это может иметь отношение к «LIKE» или «REGEXP». Я считаю, что JS учитывает любой тип числа как \ d, есть что-то подобное для SQL, потому что «-» учитывает все символы, правильно?

Уверен, что есть альтернативные способы обойти это, но игра с моим запросом будет полезна. Я действительно хочу учиться! Кроме того, подробное объяснение было бы замечательным.

Спасибо за помощь заранее!

ответ

0

Это регулярное выражение должно соответствовать всем требованиям, которые вы указали.

where column REGEXP '[0-9]{3}[:space:]*[0-9]{3}[:space:]*[0-9]{4}' 

В [0-9] средства позволяют ряд (также \d но MySQL, кажется, не поддерживает это); {3} означает, что должно быть 3 предыдущего значения (например, число). [:space:] является POSIX для пробела (также \s mysql снова, похоже, не поддерживает это) * предназначен для ноль или более случаев пробелов http://www.regular-expressions.info/posixbrackets.html.

+0

Эй, Крис, хотя это немного задержано, я хочу поблагодарить вас за подробное объяснение! из-за вашего ответа я смог произвести впечатление на моего начальника и разрешить свой SQL-запрос. Еще раз спасибо! – Aurora

+0

Рад, что это сработало. Пожалуйста, отметьте это как принятый ответ, http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work. – chris85

+0

Принятый ответ, Done! – Aurora