Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 ПРОСТЕЙШАЯ задачка  [new]
D-503
Member

Откуда:
Сообщений: 2
Встретил задачку в книге В.В. Дунаева

Есть таблица "Клиенты", поля - Имя, Адрес, Регион, Телефон. Нужно написать Запрос:
Выберите записи, в которых номера телефонов пятизначные. При этом следует предусмотреть, что номера телефонов могут содержать, а могут и не содержать дефисы, а сам номер может содержать или нет код региона, заключенный или не заключенный в круглые скобки.

Есть идеи?
23 фев 10, 23:17    [8383407]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
spudei
Member

Откуда: парта возле окна
Сообщений: 78
Можно составить регулярное выражение для фильтрации кода региона и минусов,
для виделения номера а дальше пощитать длинну номера.
23 фев 10, 23:44    [8383487]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
D-503
Member

Откуда:
Сообщений: 2
spudei,

Хотелсь бы что опытные спецы показали прямой SQL-запрос. Понятно, что вариаций много, увидеть бы хоть одну :-)
24 фев 10, 14:49    [8386058]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 24911
SELECT REVERSE(SUBSTRING(REVERSE(REPLACE('(111) 123-45-67','-','')),1,7))
24 фев 10, 15:02    [8386163]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
A_Cross
Member

Откуда:
Сообщений: 1355
ShSerge
SELECT REVERSE(SUBSTRING(REVERSE(REPLACE('(111) 123-45-67','-','')),1,7))

так в условии указано отобрать 5-ти значные,
а если SELECT REVERSE(SUBSTRING(REVERSE(REPLACE('(111) 123-45-67','-','')),1,5))
то лишние данные просто обрежутся и данные будут некоректные.
ИМХО исходные данные невозможно автоматизировать. слишком неоднозначно два условия могут содержать/несодержать
24 фев 10, 17:23    [8387385]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 24911
A_Cross
так в условии указано отобрать 5-ти значные,
а если SELECT REVERSE(SUBSTRING(REVERSE(REPLACE('(111) 1-23-45','-','')),1,5))
то лишние данные просто обрежутся и данные будут некоректные.
ИМХО исходные данные невозможно автоматизировать. слишком неоднозначно два условия могут содержать/несодержать

Ну да, пардон. На всякий случай, я бы ещё с обеих сторон прибил пробелы LTRIM(RTRIM(...)). Ну или вообще все пробелы.
Кстати, можно было проще. Вместо реверсов и сабстринга написать RIGHT(...).
Т.е., наверное, лучше так:
SELECT RIGHT(REPLACE(REPLACE('(111) 1-23-45','-',''),' ',''),5)
24 фев 10, 18:12    [8387665]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
A_Cross
Member

Откуда:
Сообщений: 1355
ShSerge
A_Cross
так в условии указано отобрать 5-ти значные,
а если SELECT REVERSE(SUBSTRING(REVERSE(REPLACE('(111) 1-23-45','-','')),1,5))
то лишние данные просто обрежутся и данные будут некоректные.
ИМХО исходные данные невозможно автоматизировать. слишком неоднозначно два условия могут содержать/несодержать

Ну да, пардон. На всякий случай, я бы ещё с обеих сторон прибил пробелы LTRIM(RTRIM(...)). Ну или вообще все пробелы.
Кстати, можно было проще. Вместо реверсов и сабстринга написать RIGHT(...).
Т.е., наверное, лучше так:
SELECT RIGHT(REPLACE(REPLACE('(111) 1-23-45','-',''),' ',''),5)
и еще добавить
where len(поле)>=5

не сочтите занудой. а если такая ситуация
SELECT RIGHT(REPLACE(REPLACE('(111) 1-2-45','-',''),' ',''),5)
выдаст
)1245
24 фев 10, 18:19    [8387691]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
A_Cross
Member

Откуда:
Сообщений: 1355
ShSerge,

+ и проверку надо сделать для конечного результата, чтоб не содержал в себе ничего кроме цифр
типа
like [0-9]
24 фев 10, 18:21    [8387700]     Ответить | Цитировать Сообщить модератору
 Re: ПРОСТЕЙШАЯ задачка  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 24911
A_Cross
...не сочтите занудой. а если такая ситуация
SELECT RIGHT(REPLACE(REPLACE('(111) 1-2-45','-',''),' ',''),5)
выдаст
)1245

А в ТЗ не написано, что четырёхциферные бывают .
24 фев 10, 21:47    [8388429]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить