![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
ayscha |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 10.9.2010 Репутация: нет Всего: нет |
Добрый день.
Составляю запрос под оракл типа case/when и получаю не то, что надо. Вот запрос. SELECT CASE WHEN (p.fk_id is null AND p.name is not null) THEN p.name /* тут выполняется неверно*/ /* ELSE c.name*/ END AS name FROM some_schema.c_table c INNER JOIN some_schema.p_table p ON p.fk_id = c.id; Ожидаю получить p.name в случае, если внешний ключ нулевой ( но при этом не нулевое p.name), иначе с.name На самом деле получаю: NAME null null null ... Т.е выбираются как раз нулевые значения. Вообще непонятно откуда такой результат. case/when вообще умеет работать со строками?? Заранее спасибо за ответы. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Если ни один when кейса не вернул истину, и отсутствует кляуза else, результат выражения - null. Добавлено через 1 минуту и 15 секунд
>>>>> Добавлено через 12 минут и 2 секунды в вашем запросе это выражение ВСЕГДА будет возвращать ложь. В силу того, что по p.fk_id происходит внутреннее соединение, в результат выборки не войдут те строки, значение fk_id для которых не определено -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
ayscha |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 10.9.2010 Репутация: нет Всего: нет |
А что это значит внутреннее соединение? Дело в том, что в таблице p fk_id во многих строках как раз null. к тому же, если я делаю обычный select и join'ом с условием p.fk_id is null мне выдаются нужные строки. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
inner join
к чему же? Если вы меняете критерий соединения, это ведь совсем уже другой запрос получается, так ведь? Это сообщение отредактировал(а) Zloxa - 27.3.2011, 01:45 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
ayscha |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 10.9.2010 Репутация: нет Всего: нет |
Простите, долго не отвечала. Так вот. я, наверное, что-то очень сильно не понимаю, но разве следующие два запроса не должны делать одно и тоже?
|
||||
|
|||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
ayscha, тот факт, что второй запрос не возвращает ожидаемый вами результат, для Вас не показателен?
Думаете оракл глючит? -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
ayscha |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 10.9.2010 Репутация: нет Всего: нет |
я не утверждаю, что оракл глючит, просто для меня не понятен такой результат, так как, как мне кажется, запросы должны делать одно и тоже. Я поэтому и обращаюсь на форум с надеждой что кото-нибудь сможет мне показать на ошибку, так как с базами данных практически не работала. Заранее спасибо за разъяснения. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Если запрос смог быть выполнен, он не содержит ошибки. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
ayscha |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 10.9.2010 Репутация: нет Всего: нет |
Уважаемый Zloxa, Вы прекрасно понимаете что конкретно спрашивается в вопросе. Поэтому, если у Вас нет ответов по делу, прошу вообще не писать. Я зашла на форум в раздел, в котором в основном постятся новички. Если Вас раздражают подобного рода вопросы, то можно просто на них не отвечать либо посещать более профессиональные форумы. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
именно что - нет. Мне казалось что я дал вам разъяснение от чего вы получаете тот результат, который получаете, однако я не понял поняли ли Вы его или не поняли, судя по отсутствию уточняющих вопросов - поняли. Мне казалось что я однозначно указал на очевидность того, что приведенные вами запросы - не эквивалентны. Мне действително не понятно какие еще у вас вопросы остались. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
ayscha |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 10.9.2010 Репутация: нет Всего: нет |
Хорошо, тогда давайте вернемся к первым комментариям. ![]() Получается, что when/case не подходит для случаев, когда в качесте аргумента указывается внешний ключ? Я сделала свою задачи в итоге с помощью юнионов, но мне кажется, что данный запрос очень громоздкий и неизящный. есть ли какой-нибудь способ сделать все тоже самое, только более изящным способ. исходная задача была выбрать имя из первой таблицы в случае, если внешний ключ на вторую таблицу нулевой, иначе выбирать по внешнему ключу соответствующее поле из второй таблицы |
|||
|
||||
Zloxa |
|
||||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
уже хоть что-то, но все равно можно интерпретировать не однозначно. Полагаю вам нужно что-то вроде:
/*однако ж этот запрос таки не эквивалентен запросу с юнион.*/ -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
||||
|
|||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |