Выбор слов, оканчивающихся на 'n' в oracle sqlplus - PullRequest
0 голосов
/ 06 октября 2018

Выберите имена и фамилии учителей таблиц, где имена заканчиваются на 'n'.

Я написал:

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

К сожалению, он не выбирает никаких строк.Должно быть выбрано как минимум два.

Проблема с "last_name like '% n'", и я не могу найти решение.Кто-нибудь есть идеи, как я могу решить эту проблему? Скриншот

Ответы [ 6 ]

0 голосов
/ 07 октября 2018

Вы можете попробовать что-то вроде SELECT * FROM teachers a WHERE TRIM (LOWER (a.first_name)) LIKE '%n';

0 голосов
/ 06 октября 2018

Если у вас есть тип данных char, вам следует попробовать обрезать пробелы по значениям вашего first_name

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

В любом случае, в вашем скриншоте у вас нет учителя с endig от firt_name с n ..try

select first_name, last_name 
from teachers 
where trim(first_name)  like '%n'; 
0 голосов
/ 06 октября 2018

Дело в том, что в вашем примере нет first_name столбцов, которые заканчиваются на n.Да.

Почему?Тип столбца first_name - CHAR вместо VARCHAR2, поэтому Oracle заполняет столбец пробелами, когда каждое имя короче 10 символов.

Решения?

  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!
    
0 голосов
/ 06 октября 2018

согласно скриншоту столбцы 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.он не добавляет пробелы в конце для достижения полной длины.

0 голосов
/ 06 октября 2018

Как вам сказали, ваш запрос должен работать.Проблема, вероятно, тривиальна (имеет значение регистр? Есть ли в этих именах действительно строчные буквы «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>
0 голосов
/ 06 октября 2018

Попробуйте использовать.Это исключит вероятность пропуска чувствительных к регистру данных.

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