SQL“ substr”与“ not in”结合

时间:2019-07-01 09:48:09

标签: sql oracle

我有一个包含以下元素的表:

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 个答案:

答案 0 :(得分:2)

当起始位置大于字符串长度时,函数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')

请参见demo
结果:

> | NODE                        |
> | :-------------------------- |
> | DA_RIMUOVERE                |
> | 582                         |
> | ghhtthth                    |
> | TESTVMM                     |
> | SACCALEN_A46C0da_cancellare |
> | MICTEST                     |
> | DA_CANCELLARE2              |

答案 1 :(得分:0)

实际上在SQL NULL中,既不是true也不是false。在您的情况下,某些字符串的长度小于9,因此substr(...)返回NULL。不在(...)中的NULL值为NULL。

其他信息可以在Ask Tom

上找到

所以,只需在类似条件上重写条件

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

答案 2 :(得分:0)

原因是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')

或者检查长度和图案。

答案 3 :(得分:0)

尝试以下查询:

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

db<>fiddle demo

干杯!