Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 17:50   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Ошибка в запросе

Не получается выполнить запрос:
Код:
SELECT PAY.[PAY_INSURER_NAME] from 
(select Fam as PAY.[PAY_INSURER_NAME], Fam & Nam &  1 as S from PAY
union Nam as PAY.[PAY_INSURER_NAME], Fam & Nam &  2 as S from PAY)  
FROM PAY;
для тестирования создал БД в Access. Задача: есть одно поле PAY_INSURER_NAME в таблице PAY, в котором храняться записи в виде Фамилия(пробел)Имя(пробел)Отчество. Надо разделить это поле на 3 отдельных поля, т.е. должно выглядеть так:
до запроса:
PAY_INSURER_NAME
--------------------
Фамилия Имя Отчество
после запроса
Fam | Name | Otchest
---- | ----- | --------
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.02.2011, 23:21   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

artemavd,
всё что пришло в голову навскидку: (запрос под Firebird)
Код:
SELECT
-- фамилия
SUBSTRING(oper_name_r
    FROM 1
    FOR position(' ', oper_name_r, 1)-1
    ) as f,

-- имя
SUBSTRING(oper_name_r
    FROM position(' ', oper_name_r, 1)+1
    FOR position(' ', oper_name_r, position(' ', oper_name_r, 1)+1)-position(' ', oper_name_r, 1)-1
    ) as n,

-- отчество
SUBSTRING(oper_name_r
    FROM position(' ', oper_name_r, (position(' ', oper_name_r, 1)+1))+1
    FOR position(' ', oper_name_r, (position(' ', oper_name_r, position(' ', oper_name_r, 1)+1)+1))
    - position(' ', oper_name_r, (position(' ', oper_name_r, 1)+1))
    ) as o
FROM dic_oper_type
WHERE dot_id = 42
P.S. нормально отрабатывает если присутствует всё ФИО полностью
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 18.02.2011, 02:55   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Спасибо большое за ответ. А в данном примере oper_name_r это мое PAY_INSURER_NAME? И что значит в данном случае условие в WHERE.? У меня этот запрос кстати не работает в DB2
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 18.02.2011 в 04:10.
artemavd вне форума Ответить с цитированием
Старый 18.02.2011, 10:26   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
А в данном примере oper_name_r это мое PAY_INSURER_NAME?
да

Цитата:
Сообщение от artemavd Посмотреть сообщение
И что значит в данном случае условие в WHERE?
я работал с одной записью т.к.
Цитата:
Сообщение от Yurka Посмотреть сообщение
P.S. нормально отрабатывает если присутствует всё ФИО полностью
Цитата:
Сообщение от artemavd Посмотреть сообщение
У меня этот запрос кстати не работает в DB2
скорее всего он не поддерживает такие функции. нужно поискать аналог
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 20.02.2011, 08:13   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот, немного упростил запрос:
Код:
SELECT DISTINCT (STH_PAYMENT.PAY_INSURER_NAME) AS F, 
                         (STH_PAYMENT.PAY_INSURER_NAME) AS N, 
                         (STH_PAYMENT.PAY_INSURER_NAME) AS O
FROM PU.STH_PAYMENT AS STH_PAYMENT
в результате которого получается такая таблица:
F___________________ | N___________________ |O___________________
Фамилия Имя Отчество | Фамилия Имя Отчество | Фамилия Имя Отчество

т.е. часть задания я вроде сделал . Но, нужно еще как-то сделать разделение значений в поле PAY_INSURER_NAME по раздельным колонкам F,N,O.
Есть предположения, что надо как-то использовать Substr и Locate, но не могу додуматься как задать условие "выбрать запись, до пробела". Может ли кто-нибудь помочь мне завершить запрос?
Результатом правильного запроса должна быть таблица такого вида:
F_______|____N|________O
Фамилия | Имя | Отчество
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 20.02.2011, 11:59   #6
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

А нужно именно через запрос ?
Или допустимо вычисляемые роля ввести ? Так проще.
asmodey1 вне форума Ответить с цитированием
Старый 20.02.2011, 14:41   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Нужно именно через запрос.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 20.02.2011, 16:27   #8
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Попробуйте
SELECT REVERSE(LEFT(REVERSE(PAY_INSURER_NA ME),LOCATE(' ',REVERSE(PAY_INSURER_NAME)) - 1)) AS domain FROM PAY
Правда, это только для выбора имени (если сработает)...
З.Ы. Так, стоп, это я что-то напутал - это часть доменного имени поля получится... Но все равно помаракуйте, может эти функции помогут ?

Последний раз редактировалось asmodey1; 20.02.2011 в 16:38.
asmodey1 вне форума Ответить с цитированием
Старый 20.02.2011, 16:37   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Ок. Есть пара вопросов.
1. Что значит REVERSE?
2. Что значит строка AS domain?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 20.02.2011, 16:59   #10
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Не-не, это я ошибся - вам это не подойдет...
Вот что я придумал.
Есть такие функции:
POSITION(substr string IN str string)
SUBSTRING(str string FROM pos integer FOR len integer)
С помощью первой можно составить подзапрос, который даст позицию пробела.
А с помощью второго - выбрать подстроку, имея начальную позицию и конечную (len=конечная-начальная).
Вот как-то так...
Если интересно, посмотрите материал по работе со строками в SQL:
http://sql.itsoft.ru/string/
asmodey1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в запросе ЛисЁНЫШ БД в Delphi 3 02.07.2010 07:35
Ошибка в запросе с датой pobedin БД в Delphi 8 17.06.2010 10:57
Ошибка в запросе LIKE Ele БД в Delphi 2 22.05.2010 13:07
Где ошибка в запросе? Bendebej SQL, базы данных 1 03.02.2010 17:09
Ошибка SQL запросе. EVG44 БД в Delphi 2 21.10.2007 22:42