【问题标题】:Selecting words that end in 'n' in oracle sqlplus在oracle sqlplus中选择以'n'结尾的单词
【发布时间】:2018-10-06 17:03:32
【问题描述】:

选择名字以“n”结尾的教师表的名字和姓氏。

我写道:

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

不幸的是,它没有选择任何行。它应该至少选择两个。

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

【问题讨论】:

  • 提供您期望查询返回的数据。列值..
  • 查询应该可以工作。所以它一定是你的数据。也许first_name(或type?)是大写的。或者first_name 可能包含尾随空格或其他一些非打印字符。如果您自己无法弄清楚,则需要发布一些重现行为的示例数据。
  • 请使用标签下方的edit 按钮编辑您的问题,并包含您正在使用的数据的示例。谢谢。
  • 在您的示例中(在屏幕截图中),您没有以 'n' 结尾的 firts_name 的 'Teacher'
  • 我更新了我的工作截图。

标签: sql database oracle sqlplus


【解决方案1】:

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

为什么? 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. 或者,如果不想改变表结构,可以TRIM()列,如:

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

【讨论】:

  • 我用 trim() 试过了,没用。我将尝试更改为 varchar2。
【解决方案2】:

尝试使用。这将消除遗漏区分大小写的数据的机会。

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

【讨论】:

  • 我按照你说的做了,还是不行。我在主帖中添加了一个屏幕截图..
【解决方案3】:

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

所以使用修剪功能:

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

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

【讨论】:

    【解决方案4】:

    如您所说,您的查询应该有效。问题可能是微不足道的(大小写重要吗?这些名称中真的有小写的“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>
    

    【讨论】:

    • 我在主帖中添加了一张带有表格及其内容的屏幕截图,它仍然无法正常工作。
    • 问题的原因是列的数据类型 - CHAR 右填充空格,直到列的全长。例如,如果它是 CHAR(10) 并且您将“Mike”放在那里,它将被存储为Mike 。你应该 TRIM 列。或者,切换到 VARCHAR2(这是首选解决方案)。我已经编辑了我的答案,只是为了展示 CHAR 会发生什么。
    【解决方案5】:

    如果你有 char 数据类型,那么你应该尝试从你的 first_name 值中修剪空格字符

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

    无论如何,在你的截图中,你没有以 n 结尾的 firt_name 老师 ..try

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

    【讨论】:

    • 修剪不起作用。我将尝试将类型更改为 varchar2。
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2012-12-16
      • 2011-10-26
      • 2015-05-31
      • 2019-12-04
      相关资源
      最近更新 更多