我对这个SQL查询做错什么?

时间:2019-10-22 14:17:55

标签: sql oracle

enter image description here

SELECT * 
FROM bd2_zbiorcza
WHERE
  NOT (imie like '%a')
  AND plec = 'K';

有人可以告诉我这个查询我在做什么吗?

我想要imie不以'a'结尾的行。我在做什么错了?

3 个答案:

答案 0 :(得分:2)

您的查询应该可以使用

测试数据

CREATE TABLE test_data ( imie, plek ) AS
SELECT 'aaa', 'K' FROM DUAL UNION ALL
SELECT 'bbb', 'K' FROM DUAL UNION ALL
SELECT 'cba', 'K' FROM DUAL UNION ALL
SELECT 'ddd', 'K' FROM DUAL;

查询

您可以使用:

SELECT *
FROM   test_data
WHERE  NOT( imie LIKE '%a' ) AND plek = 'K'

或者,不带方括号:

SELECT *
FROM   test_data
WHERE  NOT imie LIKE '%a' AND plek = 'K'

或使用NOT LIKE

SELECT *
FROM   test_data
WHERE  imie NOT LIKE '%a' AND plek = 'K'

输出

它们全部输出:

IMIE | PLEK
:--- | :---
bbb  | K   
ddd  | K   

db <>提琴here


可能出什么问题了

  1. 您可以使用带有重音符号的a(由于您发布的是图片而不是文字,因此不明显)。
  2. 文本后面可以有一个空格字符。例如:db<>fiddle
  3. 您可能将数据存储在固定大小的CHAR列(已用空格右填充)中,而不是存储在可变大小的VARCHAR2列中。例如:db<>fiddle

答案 1 :(得分:0)

有时,文字后面有不可见的字符。 F.e.空格,制表符,换行符,...

大多数时候它只是空格。
但是,当您使用“不喜欢”过滤时,可以修剪掉这些尾随空格。

例如,使用RTRIM函数。

SELECT * 
FROM bd2_zbiorcza
WHERE RTRIM(imie) NOT LIKE '%a'
  AND plec = 'K';

如果不仅仅是空格,则可以使用正则表达式。

SELECT *
FROM bd2_zbiorcza
WHERE NOT REGEXP_LIKE(imie, 'a\s*$')
  AND plec = 'K';

答案 2 :(得分:0)

使用正则表达式:

SELECT * 
FROM bd2_zbiorcza
WHERE
  not regexp_like(lower(imei), '.+a$')
  AND plec = 'K';
相关问题