Как получить 'IS NULL', где значения предложения, если начальное условие не возвращает ни одного в оракуле - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть таблица со следующими значениями

! [ИД S_ID ИМЯ 1 Джеймс 2 2455 Патрик 3 2566 Сэм 4 25988 Рик] 1

Мое требование состоит в том, чтобы получить ИМЯ на основе S_ID, а если указанный S_ID отсутствует в таблице, тогда получить ИМЯ без S_ID

EX: SELECT NAME FROM STUDENTS WHERE S_ID=2455

Результат будетбыть Патрик

SELECT NAME FROM STUDENTS WHERE S_ID=2411

Результат должен быть Джеймс

Я пытался

select NAME from STUDENTS where S_ID=2455 or S_ID IS NULL

Даёт бот Джеймс и Патрик

Буду очень признателен за любую помощь

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

Вот один из вариантов:

SQL> set ver off
SQL> with students (id, s_id, name) as
  2    (select 2, 2389, 'Patrick' from dual union all
  3     select 1, null, 'James'   from dual union all
  4     select 3, 2566, 'Sam'     from dual
  5    )
  6  select name from students where s_id = &&par_s_id
  7    and exists (select null from students where s_id = &&par_s_id)
  8  union all
  9  select name from students where s_id is null
 10    and not exists (select null from students where s_id = &&par_s_id);
Enter value for par_s_id: 2389

NAME
-------
Patrick                               --> because S_ID = 2389 exists in a table

SQL> undefine par_s_id
SQL> /
Enter value for par_s_id: 123456

NAME
-------
James                                 --> because S_ID = 123456 doesn't exist

SQL>

Поскольку у вас уже есть таблица, вы будете использовать код из строки №6 и далее.

0 голосов
/ 04 ноября 2019

@ Джо,

попробуйте этот t-sql (и извините, я использовал maria db - так что использовал его). в основном это остается тем же самым как для моего вышеупомянутого ответа только, что я обновил блок else. (Примечание. Если вы используете MySQL, вы можете просто использовать его для тестирования)

DROP PROCEDURE IF EXISTS prod_studentName; DELIMITER $$ CREATE PROCEDURE `prod_studentName` ()`

BEGIN

declare sidValue int;
set sidValue = 2389;
if exists (select NAME from STUDENT where S_ID = sidValue ) 
then
    select NAME from STUDENT where S_ID = sidValue;
else
    select NAME from STUDENT where S_ID is NULL;
end if;`

END$$

DELIMITER ;

см. Прилагаемое изображение для входных данных таблицы - enter image description here

результаты теста

положительный тест - поиск для s_id = 2389

результат - enter image description here

отрицательный тест - поиск для s_id = 7777 этот идентификатор даже не существует

результат - enter image description here

надеюсь, это поможет вам

0 голосов
/ 01 ноября 2019

@ Джо,

Насколько я понимаю, если S_ID найден в таблице STUDENT, он должен вернуть ИМЯ учащегося, если S_ID не найден, запрос должен вернуть сообщение как «Нет #S_ID». .

Пожалуйста, дайте мне знать, если я делаю какую-либо ошибку в понимании вашего вопроса!

[Решение] Это Tsql, поэтому мы можем использовать его как в SQL или на любом языке. И обратите внимание, я проверил это в MSSQL, но подход остается тем же.

declare @sidInput int set @sidInput = 2455 if exists (select NAME from STUDENTS where S_ID = @sidInput) begin select NAME from STUDENTS where S_ID = @sidInput end else begin declare @outputMsg varchar(20) set @outputMsg = 'No ' + convert( varchar(10), @sidInput) select top 1 @outputMsg as NAME from STUDENTS where S_ID not in ( @sidInput ) end

[Тестовые случаи]

1) Для ввода @sidInput = 2455

Output - NAME as Patrick

2) Для ввода @sidInput = 2411

Output - NAME as James

3) Для ввода @sidInput = 2222 #S_ID значение не найдено в таблице STUDENT

Output - NAME as No 2222

ПустьЯ знаю, если это работает для вас.

С уважением,

Арнаб

...