SQL «substr» объединяется с «not in» - PullRequest
0 голосов
/ 01 июля 2019

У меня есть таблица (ne) с этими элементами:

LECOT113_A42401
DA_RIMUOVERE
TVCCVC16_A46C01
CBCELEN1_A46C01
SPCBA440_A46C02
582
ghhtthth
TESTVMM
SACCALEN_A46C0da_cancellare
MICTEST
DA_CANCELLARE2

, и я использую этот запрос:

select  ne.NODE     
from    ne
where   substr(ne.NODE,9,2) not in ('_A')

почему результат:

DA_RIMUOVERE
DA_CANCELLARE2

и не это (ЦЕЛЬ):

582
DA_RIMUOVERE582
ghhtthth
TESTVMM
SACCALEN_A46C0da_cancellare
MICTEST
DA_CANCELLARE2

Спасибо!

Ответы [ 4 ]

2 голосов
/ 01 июля 2019

Функция substr() возвращает null, когда начальная позиция превышает длину строки, поэтому сравнение null с '_A' дает неверные результаты.
Так что измени на это:

select  ne.NODE     
from    ne
where   length(ne.NODE) < 9 or length(ne.NODE) <> 15 or substr(ne.NODE,9,2) not in ('_A')

См. Демоверсию .
Результаты:

> | NODE                        |
> | :-------------------------- |
> | DA_RIMUOVERE                |
> | 582                         |
> | ghhtthth                    |
> | TESTVMM                     |
> | SACCALEN_A46C0da_cancellare |
> | MICTEST                     |
> | DA_CANCELLARE2              |
0 голосов
/ 01 июля 2019

Попробуйте следующий запрос:

SELECT
    NODE
FROM
    (
        SELECT
            NE.NODE,
            SUBSTR(NE.NODE, 9, 2) SUBST
        FROM
            NE
    )
WHERE
    SUBST <> '_A'
    OR SUBST IS NULL

db <> fiddle demo

Ура !!

0 голосов
/ 01 июля 2019

Причина в том, что Oracle путает пустую строку ('') и NULL значения. Итак, подстрока возвращает NULL - и тогда большинство сравнений возвращают NULL, а не false.

Один метод будет использовать LIKE:

where ne.NODE not like '_________$_A%' escape '$' 

Или regexp_like():

where regexp_like(ne.NODE, '^.{9}_A') 

Или быть уверенным, что строка достаточно длинная:

where substr(ne.NODE || 'xxxxxxxxxxx', 9, 2) not in ('_A')

Или проверка длины, а также скороговорки.

0 голосов
/ 01 июля 2019

На самом деле в SQL NULL ни true, ни false. В вашем случае длина вашей строки меньше 9, поэтому substr (...) возвращает NULL. Значение NULL не в (...) равно NULL.

Дополнительную информацию можно найти на Спросите Тома

Итак, просто перепишите условие на что-то вроде

select  ne.NODE     
from    ne
where   nvl(substr(ne.NODE,9,2),'x') not in ('_A')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...