Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 241
от 09.04.2007, 15:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 409, Экспертов: 61
В номере:Вопросов: 2, Ответов: 3


Вопрос № 80991: Всем здрасте! Подскажите как написать запрос, чтобы из данных, например 1/124545485(125), вырезать цифры до знака слэш, после слеш до скобки, и саму цифру взять из скобок. То есть чтобы получились в итоге отдельные столбцы : 1 124545485 125<...
Вопрос № 80994: Еще раз здрасте! В принципе мой предыдущий вопрос был аналогичный, но пока ответа не было, задам еще один: Как из ФИО (Иванов Иван Иванович) запросом сформировать 3 столбца, чтобы в итоге было: Familia Name Otchestvo Иванов Иван Иванович...

Вопрос № 80.991
Всем здрасте! Подскажите как написать запрос, чтобы из данных, например 1/124545485(125), вырезать цифры до знака слэш, после слеш до скобки, и саму цифру взять из скобок. То есть чтобы получились в итоге отдельные столбцы :

1 124545485 125

Количество цифр может варьироваться, т.е. точная длина неизвестна(т.е. функцию substring уже использоват нельзя).
Заранее спасибо!
Отправлен: 04.04.2007, 09:53
Вопрос задал: Shtuchka007 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Ерёмин Андрей
Здравствуйте, Shtuchka007!
В SQL есть все необходимые функции для работы со строками. В данном случае могут понадобиться:
LENGTH() - длина строки;
LOCATE(A,B) - позиция подстроки A в строке B;
LOCATE(A,B,C) - позиция подстроки B в строке A, начиная с позиции C;
SUBSTRING(A,B,C) - возвращает подстроку из A, с позиции B до позиции C.
Этого вполне достаточно. Таким образом:
SUBSTRING(`str`,1,LOCATE("/",`str`)-1) - 1-ый фрагмент
SUBSTRING(`str`,LOCATE("/",`str`)+1,LOCATE("(",`str`)-LOCATE("/",`str`)-1) - 2-ой
SUBSTRING(`str`,LOCATE("(",`str`)+1,LOCATE(")",str)-LOCATE("(",`str`)-1) - 3-ий
А вот и запрос целиком:
SELECT SUBSTRING(`str`,1,LOCATE("/",`str`)-1) , SUBSTRING(`str`,LOCATE("/",`str`)+1,LOCATE("(",`str`)-LOCATE("/",`str`)-1) , SUBSTRING(`str`,LOCATE("(",`str`)+1,LOCATE(")",str)-LOCATE("(",`str`)-1) FROM `table`
Здесь `table` - таблица, `str` - поле, содержащее это исходное выражение.
Желаю удачи!
---
Дополнение: в SQL Server 2000 вместо функции LOCATE следует использовать CHARINDEX.

---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 04.04.2007, 11:08
Оценка за ответ: 4
Комментарий оценки:
Выдает ошибку:неизвестный LOCATE. Я использую SQL SERVER 2000


Вопрос № 80.994
Еще раз здрасте! В принципе мой предыдущий вопрос был аналогичный, но пока ответа не было, задам еще один: Как из ФИО (Иванов Иван Иванович) запросом сформировать 3 столбца, чтобы в итоге было:

Familia Name Otchestvo
Иванов Иван Иванович
Отправлен: 04.04.2007, 10:05
Вопрос задал: Shtuchka007 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Ерёмин Андрей
Здравствуйте, Shtuchka007!
Используем те же самые функции (см. вопрос №80991), только здесь всё более запутанно :-) Алгоритм: первая часть вырезается от начала строки до первого пробела; вторая часть - от первого пробела до второго, который в свою очередь ищется точно также, как и первый пробел, только со сдвигом до позиции первого пробела; ну и третья часть - от второго пробела до конца строки. А вот и весь запрос:
SELECT
SUBSTRING(`str`,1,LOCATE(" ",`str`)-1) AS NAME1,
SUBSTRING(`str`,LOCATE(" ",`str`),LOCATE(" ",`str`,LOCATE(" ",`str`)+1)-LOCATE(" ",`str`)) AS NAME2,
SUBSTRING(`str`,LOCATE(" ",`str`,LOCATE(" ",`str`)+1),LENGTH(`str`)) AS NAME3
FROM `table`

Желаю удачи! :-)
---
Дополнение: в SQL Server 2000 вместо функции LOCATE следует использовать CHARINDEX.

---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 04.04.2007, 11:21
Оценка за ответ: 4
Комментарий оценки:
Ошибка:
Server: Msg 195, Level 15, State 10, Line 2
'LOCATE' is not a recognized function name.

Отвечает: Филатов Евгений Геннадьевич
Здравствуйте, Shtuchka007!
Запросы созданы и проверены на SQL Server 2000.
Обязательно должно быть не менее двух пробелов! ( если в строке два слова, то после первого можно поставить два пробела, если всего одно, то не знаю - скорее всего нужно исправить запрос, хотя тогда еще более запутается ).
У меня таблица Deputat, поле ACName.
В примере 1 для поиска символа используется функция Patindex, для выделения части строки функция Substring, и еще для определения длины строки функция Len.
В примере 2 использована функция CHARINDEX для поиска символа с определенной позиции (практически совпадает с ответом Ерёмина Андрея).
С уважением.

Приложение:

Ответ отправил: Филатов Евгений Геннадьевич (статус: 7-ой класс)
Ответ отправлен: 04.04.2007, 15:55
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.47 от 06.04.2007
Яндекс Rambler's Top100

В избранное