У меня нет большого опыта работы с Oracle, поэтому простите меня, если это очевидно:

У нас есть таблица сотрудников с полем EMPLOYEE_ADDRESS, определенным как char (60 BYTE)

Нам нужен простой способ узнать кого угодно, у кого ничего нет в поле адреса электронной почты.

Следующие два запроса не возвращают результатов:

Select * from employee where email_address is null;  -- fails because the records aren't null, they're empty;

select * from employee where email_address = '';

Поэтому я подумал, может быть, проблема в том, что из-за определения поля мне нужно 60 пробелов, поэтому я попробовал это, и он вернул ожидаемые результаты:

select * from employee where email_address  = '                                                            ';

Это работает, но кажется глупым, и я не хочу вводить это в производственный код. Итак, я попытался обрезать результаты, например, по одному из следующих трех запросов:

select * from employee where TRIM(email_address) = '';
select * from employee where RTRIM(email_address) = '';
select * from employee where LTRIM(email_address) = '';

Ничего из этого не сработало, поэтому, чувствуя разочарование и просто зная, сработает ли это, я устал от этого, чтобы посмотреть, имеет ли обрезка какой-либо эффект:

select * from employee where ltrim(email_address) || 'a'  = 'a';

Это сработало. (Реакция .. ват?)

Поэтому мне, во-первых, интересно, почему использование различных функций обрезки не сработало, а во-вторых, как я могу построить запрос, чтобы он буквально не искал 60 пробелов?

1
David 17 Фев 2015 в 22:55

2 ответа

Лучший ответ

Это будет работать

select * from employee where TRIM(email_address) is null

Причина, по которой вышеперечисленное работает, а это нет

select * from employee where TRIM(email_address) = ''

Потому что Oracle рассматривает текст нулевой длины как нулевой.

Если вы хотите работать с пустыми ячейками, вы должны использовать NVL, чтобы дать ему значение по умолчанию, чтобы уравнение могло делать то, что должно.

См. Здесь для получения дополнительной информации Почему Oracle 9i обрабатывает пустую строку как NULL?

1
Community 23 Май 2017 в 12:28
Select * from employee where NVL(trim(email_address), '*') <> '*';
2
Art 17 Фев 2015 в 20:04