#sql #oracle10g
#sql #oracle10g
Вопрос:
итак, я пишу запрос выбора, используя функцию декодирования, и устанавливаю результат в переменную.
Дело в том, что когда нет строк, я всегда получаю ошибку no result.
Я попытался расшифровать значение и подсчитать, но безрезультатно.
SELECT decode(count(id), 0, (select id from t_table where intitule = '?' and id_type = 93), id) into v_id
from t_table where intitule = null
group by id;
SELECT decode(id, null, (select id from t_table where intitule = '?' and id_type = 93), id) into v_id
from t_table where intitule = null
group by id;
Но, поскольку нет строки для декодирования, это не работает.
Итак, мой запрос должен получить идентификатор в v_id, где intitule = значение, иначе он вернет значение по умолчанию, которое существует в t_table.
И поскольку у меня всегда есть 0 строк, я выдаю сообщение об ошибке «Результат не найден».
Так, например, я ввел в t_table эти три строки
id | intitule | id_type
1 | ? | 5
2 | electricien | 5
3 | mécanicien | 4
У меня будет, где я не указал название, так что intitule = null
Таким образом, это вернет 0 строк.
Но я знаю его id_type, поэтому, если я не нашел ни одной строки (это так), я возвращаю значение по умолчанию (?) для id_type, которое я знаю (5).
Так что, в конце концов, я должен 1
проникнуться v_id
.
Но если у меня есть intitule = 'electricien'
, значит, я попаду 2
в v_id
.
Разве так лучше?
Кто-нибудь может мне помочь?
Комментарии:
1. Не могли бы вы предоставить некоторые примеры данных и желаемый результат? У меня, например, возникли проблемы (без каламбура) с расшифровкой вопроса.
2. @JoachimIsaksson Я редактирую свой вопрос. Я надеюсь, что это понятнее для понимания.
3.
intitule = null
никогда не работает, используйтеintitule is null
4. @ammoQ да, и ответ должен касаться двух возможных ситуаций: заголовок = ‘value’ или заголовок равен null. Но, похоже, ответ от Торстена подойдет.
Ответ №1:
К сожалению, в том, что вы делаете, есть более одного недостатка.
Прежде всего where intitule = null
никогда не будет работать. Значение NULL ничему не равно, поэтому = с ним не работает. Это должно быть where intitule is null
вместо этого.
Но тогда вы хотите выбрать одну строку. Итак, почему вы группируете по идентификатору? Группировать по идентификатору означает: получить одну запись для каждого идентификатора. Это совсем не то, что вы хотите. Вы хотите вернуть один идентификатор.
Кажется, вы считаете intitule уникальным? Затем просто выберите идентификатор для требуемого заголовка. Если я правильно понимаю, нет записи, где intitule равен null, верно? Вы хотите выбрать конкретную запись только в том случае, если для поиска не задан заголовок. Поэтому используйте OR в вашем предложении where: либо заголовок задан и должен совпадать, либо он не задан и заголовок должен совпадать с ‘?’, а id_type должен быть 93.
select id
into v_id
from t_table
where intitule = vi_intitule
or (vi_intitule is null and intitule = '?' and id_type = 93);
Комментарии:
1. Спасибо, кажется, это работает. Насколько мне известно, один вопрос: что означает
:
после переменной?2. О, извините за путаницу; двоеточия там быть не должно. Он используется в Oracle для переменных в SQL. Поскольку вы находитесь в PL / SQL, переменные не должны иметь двоеточия. Я обновлю свой ответ.
Ответ №2:
Попробуйте это:
SELECT
decode
(
select count(id) from t_table where id= e.id group by id,
0,
(select id from t_table where intitule = '?' and id_type = 93),
id
)
into v_id
FROM t_table e where intitule is null
GROUP BY id;
Комментарии:
1.
intitule = null
никогда не работает, используйтеintitule is null