SQL 检查字符串中的最后一个字母/又名奇怪的行为

SQL checking the last letter in string / AKA LIKE strange behaviour

我知道已经有人回答了,但它对我不起作用。

这么快介绍一下:

我有 table 呼叫 swimmers。我将向其中插入满足所有列的新记录:

INSERT INTO swimmers(id, first_name, last_name, age, gender)
VALUES(9,'Maria','Spolsky',34,'Female');

现在我想在 swimmers table 中查找 first_name 以字母 a 结尾的记录以及在哪里性别是 Female

所以我写了SQL查询:

SELECT first_name, last_name
FROM swimmers
WHERE first_name NOT LIKE '%a' AND gender = 'Female'

但它确实 return Maria 我们刚刚添加的。基本上 return 每个女性

我正在使用 ORACLE iSQL plus。

编辑:

我尝试使用substr(first_name, -1) = 'a'但结果-1是空的,因为我使用varchar(20)并且名称通常小于20个字符

编辑 2:

我试图找出数据类型的问题。我用 char(20) 代替 first_name.

我改成了varchar2(20):

ALTER TABLE swimmers 
MODIFY first_name varchar2(20);

但没有解决问题

编辑 3:

正在将 NOT LIKE 更改为 WHERE first_name LIKE '%a' return 没有行。我认为问题在于数据类型和空 spaces 从 first_name 的末尾到字符串保留 space 的末尾(名称有 ~10 个字符,我使用 `varchar2(20 ))

显然 oracles 在名称后面添加了空格,这就是 '%a' 不起作用的原因,要么将您的列定义更改为 varchar(这样 oracle 就不会添加额外的空格)或 trim你名字中的空格是这样的:

SELECT first_name, last_name
FROM swimmers
WHERE NOT trim(first_name) LIKE '%a' AND gender = 'Female';