在oracle sqlplus中选择以'n'结尾的单词

Selecting words that end in 'n' in oracle sqlplus

Select table 位老师的名字和姓氏,其中名字以 'n' 结尾。

我写道:

select first_name, last_name 
from teachers 
where type='teacher' 
and last_name like '%n'; 

很遗憾,select没有行。它应该 select 至少两个。

问题出在“last_name like '%n'”,我找不到解决方案。有谁知道我该如何解决这个问题?Screenshot

尝试使用。这将消除遗漏区分大小写数据的可能性。

select first_name, last_name from teachers where lower(type)='teacher' and lower(first_name ) like '%n'; 

如您所知,您的查询应该有效。问题可能是微不足道的(大小写重要吗?这些名字中真的有小写字母 "n" 吗?)。

同时,有几个选项供您选择:

SQL> select ename from emp
  2  where ename like '%N';

ENAME
----------
ALLEN
MARTIN

SQL> select ename from emp
  2  where substr(ename, -1) = 'N';

ENAME
----------
ALLEN
MARTIN

SQL> select ename from emp
  2  where regexp_like(ename, 'N$');

ENAME
----------
ALLEN
MARTIN

SQL>

[编辑:CHAR 数据类型问题]

SQL> create table empc (ename char(10));

Table created.

SQL> insert into empc select ename from emp;

12 rows created.

SQL> select ename from empc where ename like '%N';

no rows selected

SQL> select ename from empc where trim(ename) like '%N';

ENAME
----------
ALLEN
MARTIN

SQL>

根据屏幕截图,first_name、last_name 列的数据类型为 CHAR。 关于 CHAR 的事情是附加空格以达到其全长。 示例:对于 first_name CHAR(10),如果您存储 'Andra',它将存储为 'Andra '

所以使用trim函数:

select first_name, last_name 
from teachers 
where type='teacher' 
and trim(first_name) like '%n';

或者使用 VARCHAR2 数据类型代替 CHAR。 它不会在末尾附加空格以达到其全长。

事实是,在您的示例中没有 first_name 列以 n 结尾。是的。

为什么? first_name 的列类型是 CHAR 而不是 VARCHAR2,因此当每个名字少于 10 个字符时,Oracle 会用空格填充该列。

解决方案?

  1. 使用 VARCHAR2 而不是 CHAR,如:

    create table teacher (
      last_name varchar2(10), -- VARCHAR2 now!
      first_name varchar2(10), -- VARCHAR2 now!
      type varchar2(10)
    );
    

    使用此结构,您的查询将 运行 很好。

  2. 或者,如果您不想更改 table 结构,您可以 TRIM() 该列,如:

    select first_name, last_name 
    from teachers 
    where type='teacher' 
    and trim(first_name) like '%n'; -- use TRIM here!
    

如果您有 char 数据类型,那么您应该尝试从 first_name 值

中修剪 space 个字符
select first_name, last_name 
from teachers 
where type='teacher' 
and trim(first_name)  like '%n'; 

无论如何,在您的屏幕截图中,您还没有用 firt_name 结束 n ..try

select first_name, last_name 
from teachers 
where trim(first_name)  like '%n'; 

你可以尝试类似 SELECT * FROM teachers a WHERE TRIM (LOWER (a.first_name)) LIKE '%n';