Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вернуть одно поле из трёх, какое - заранее неизвестно 
V
    Опции темы
ksili
Дата 29.5.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Есть таблица:
Код

CREATE TABLE T_USERS (
    ID_USER                    INTEGER NOT NULL,
    PHONE                      CHAR(11),
    USER_ACTIVE                CHAR(1) NOT NULL,
    SUMMA_OST                  NUMERIC(15,2) NOT NULL,
    PHONE2                     CHAR(11) COLLATE WIN1251_UA,
    PHONE3                     CHAR(11) COLLATE WIN1251_UA,
    A2                         CHAR(1) DEFAULT 0,
    A3                         CHAR(1) DEFAULT 0,
);

Т.е. у одного пользователя может быть три номера телефона и каждому номеру соответствует признак активности (в таблице он может быть null, '0' или '1'): USER_ACTIVE для PHONE, A2 для PHONE2, A3 для PHONE3.
В настоящее время PHONE2 и PHONE3 не используются и информация о пользователе получается таким запросом:
Код

select ID_USER, SUMMA_OST, USER_ACTIVE from T_USERS where PHONE='89012345678'

Т.к. PHONE2 и PHONE3 использоваться будут, надо этот запрос переделать таким образом, чтобы возвращался признак активности в зависимости от того, с каким номером совпал указанный номер телефона, с PHONE, PHONE2 или PHONE3. Т.е. кол-во возвращаемых параметров увеличиваться не должно. 
Например, если есть запись с PHONE='89001112233', USER_ACTIVE='1', PHONE2='89012345678'='0', PHONE3=null, A3=null, то запрос должен будет вернуть в качестве признака активности '0' 

При помощи ХП это сделать просто, а вот можно ли одним запросом?

CУБД FireBird 2.0.3

Это сообщение отредактировал(а) ksili - 29.5.2008, 10:15


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Deniz
Дата 29.5.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Можно попробовать CASE или IIF:
Код
select ID_USER, SUMMA_OST, 
case 
  when PHONE = '89012345678' then USER_ACTIVE
  when PHONE2 = '89012345678' then A2
  when PHONE3 = '89012345678' then A3
  else null
end Phone_Active
from T_USERS 
where '89012345678' in (PHONE, PHONE2, PHONE3)

вот только не совсем понятно что делать, если номера вдруг совпадут?
А лучше нормализовать БД - PHONE и Active вынести в детальную таблицу.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
ksili
Дата 29.5.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Сейчас попробую.
Совпадающих номеров в базе не бывает

Добавлено через 13 минут и 36 секунд
Deniz, спасибо, работает


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0624 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.