Сравнение чисел со строками в Oracle - PullRequest
0 голосов
/ 24 апреля 2018

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

SELECT * FROM VW_STATUSNEW

ID STATUS_1 STATUS_2
1  FAIL     1
2  FAIL     NULL
3  1        NULL
4  NULL     2
5  2        2
6  2        FAIL
7  NULL     NULL

Возможно ли в Oracle возвращать все строки, в которых STATUS_1 и STATUS_2 не совпадают. Итак, используя данные выше, необходимые результаты: -

ID STATUS_1 STATUS_2
1  FAIL     1
2  FAIL     NULL
3  1        NULL
4  NULL     2
6  2        FAIL

Проблема, похоже, заключается в сравнении слова FAIL с числом и угождении NULL.

Ответы [ 5 ]

0 голосов
/ 24 апреля 2018

Это один из немногих случаев, когда DECODE все еще полезен, потому что согласно декодированию NULL равен нулю.

select * 
  from VW_STATUSNEW
 where decode(status_1, status_2, 1, 0) = 0;
0 голосов
/ 24 апреля 2018
with testtab as (select 'Fail' "STAT1", '1' "STAT2" from dual
union all select 'Fail', null from dual
union all select '1', null from dual
union all select null, '2' from dual
union all select '2', '2' from dual
union all select '2', 'FAIL' from dual
union all select null, null from dual)
select * from testtab
where nvl(STAT1,-1) != nvl(STAT2,-1);

возвращает

Stat1   Stat2 
Fail    1
Fail    null
1       null
null    2
2       FAIL

Stat1 = status_1 в вашем примере.

nvl(value, altValue) возвращает altValue, если value равно нулю

0 голосов
/ 24 апреля 2018
SELECT *
FROM VW_STATUSNEW
WHERE STATUS_1 <> STATUS_2
OR (STATUS_1 IS NULL AND STATUS_2 IS NOT NULL)
OR (STATUS_1 IS NOT NULL AND STATUS_2 IS NULL);

ИЛИ

SELECT *
FROM VW_STATUSNEW
WHERE STATUS_1 <> STATUS_2
OR NOT (STATUS_1 IS NULL AND STATUS_2 IS NULL)

Выход

ID  STATUS_1    STATUS_2
1   FAIL        1
2   FAIL        (null)
3   1           (null)
4   (null)      2
6   2           FAIL

Демо

http://sqlfiddle.com/#!4/3694b/5

0 голосов
/ 24 апреля 2018

попробуйте с этим:

SELECT 
  ID 
  ,STATUS_1 
  ,STATUS_2 
FROM VW_STATUSNEW 
where NVL(STATUS_1, '0') != NVL(STATUS_2, '0')
0 голосов
/ 24 апреля 2018

Два статуса имеют одинаковый тип (в обоих столбцах есть строки). так что сравнение не должно быть проблемой. Вот один из способов:

SELECT *
FROM VW_STATUSNEW
WHERE (status1 <> status2) OR
      (not (status1 is null and status2 is null)) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...