我有一个包含以下元素的表:
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
谢谢!
答案 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
干杯!