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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PL\SQL аргумент decode select. Как сделать, аргумент функции decode select 
:(
    Опции темы
tvik
Дата 13.6.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.10.2006

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



Всем, привет!!
не подскажете, можно ли в качесчтве аргумента функции decode (pl\sql) использовать select

ну типа так:
Код

select 
 max(decode(cd.f_id, (select fd_id from f form where f.code_name='AR'),count(cd.cd_id))) a5 from cd


то есть если значение cd.f_id лежит в диапозоне, возвращаемым селектом select fd_id from f form where f.code_name='AR'),count(cd.cd_id)), то считаем эту строку

Если так сделать нельзя, то как можно?

Спасибо заранее за любые комментарии
PM MAIL   Вверх
TicTak
Дата 13.6.2007, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 2.3.2005

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



Цитата(tvik @  13.6.2007,  10:10 Найти цитируемый пост)
то есть если значение cd.f_id лежит в диапозоне

Decode не смотрит на диапазон, ему нужно конкретное значения. И не пойму зачем ты max прилепил?
Если я правильно понял что ты хочеш, то попробуй так:
Код

SELECT COUNT (1)
  FROM cd
 WHERE cd.f_id IN (SELECT fd_id
                     FROM f form
                    WHERE f.code_name = 'AR')

PM   Вверх
tvik
Дата 13.6.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.10.2006

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



max затем, что select большой и нужно группировка, и чтобы не толкать эту лабуду в group by использую max

то есть в decode() нельзя использовать ни  like,in - плохо (((, а есть какая-нить функция типа decode, в которой можно сравнивое выражение задавать, типа

decode(temp,'hell%','hello word',null)
PM MAIL   Вверх
TicTak
Дата 13.6.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 2.3.2005

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



Код

SELECT   COUNT (cd.cd_id)
    FROM cd, f
   WHERE cd.f_id = f.fd_id AND f.code_name = 'AR'
GROUP BY f.fd_id
ORDER BY ID DESC



Цитата(tvik @  13.6.2007,  13:28 Найти цитируемый пост)
 а есть какая-нить функция типа decode, в которой можно сравнивое выражение задавать, типаdecode(temp,'hell%','hello word',null)

Смотри case
PM   Вверх
tvik
Дата 13.6.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.10.2006

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



Понятненько, а еще такой вопросик:
можно ли сделать конкатенацию результатов двух селектов, именно результатов
что-то типа:

Код

select cd.cd_id  from cd
inner join on cd.cd_id=drv.cd_id
select drv.cd_id from drv

PM MAIL   Вверх
DimW
Дата 13.6.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

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



tvik, контсрукция которую ты хотел использовать в первом топе в полне допустима:

Код

select decode(1,(select 1 from dual), 'Yes', 'No')
from dual


Но в decode ты можешь использовать только конкретные сравнения, ни каких диапозонов сравнить не удастся.
И ты получишь эксепшен если селект в декоде вернет больше одного значения, что судя по твоему примеру гарантировано:
Код

select fd_id from f form where f.code_name='AR'


Цитата(TicTak @  13.6.2007,  12:12 Найти цитируемый пост)
Смотри case

case - более гибкая конструкция:
Код

select (case when 1 between (select 1 from dual) and (select 5 from dual) then 'Yes' else 'No' end)
from dual

Но все та же потенциальная бага в случае если селекты в кейсе вернут больше одной строки.
Если тебе всетаки нужно делать сравнение с несколькими значениями, то стоит сменить тактику...

Добавлено @ 13:15
Цитата(tvik @  13.6.2007,  13:01 Найти цитируемый пост)
можно ли сделать конкатенацию результатов двух селектов, именно результатов
что-то типа:

если я тебя правельно понял то тебе нужно это:
Код

select 1 from dual
union all
select 2 from dual



Это сообщение отредактировал(а) DimW - 13.6.2007, 13:17
PM MAIL ICQ   Вверх
tvik
Дата 13.6.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.10.2006

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



DimW, спасибо все понятно, ты всегда мне помогаешь
только мне нужно не union, а именно join
чтобы 1 и 2 были не подряд в строках, а в столбцах
Но что-то такое ощущение, что то, что я хочу сделать какая-то ерунда.

Выведите из заблуждения пожалуйста
PM MAIL   Вверх
DimW
Дата 13.6.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

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



Цитата(tvik @  13.6.2007,  13:33 Найти цитируемый пост)
Но что-то такое ощущение, что то, что я хочу сделать какая-то ерунда.

если проблема сджоинить вместо таблицы селект то вот:
Код

select a.f2, b.f2 
from (select 1 f1, 'xxx' f2 from dual) a
inner join (select 1 f1, 'yyy' f2 from dual) b on a.f1 = b.f1


Добавлено @ 14:20
ни join ни union к конкитинации не имеет ни какова отнашение, я просто попытался понять что ты имел ввиду...
конкитинация это склеивание значений:
Код

select 'xxx'||555||sysdate||user from dual



Это сообщение отредактировал(а) DimW - 13.6.2007, 14:21
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




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


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

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