2015-02-17 4 views
1

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

У нас есть таблица Employee с 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 пробелов ?

+0

насчет этого 'выберите * от сотрудника, где TRIM (email_address) является null' – alkis

+0

Это работает. Спасибо. Любая официальная причина, почему это сработает? Я действительно знаком с SQL-сервером, поэтому я все еще изучаю различия в том, как ведет себя Oracle. – David

+0

См. Мой ответ. Oracle обрабатывает текст нулевой длины как null. Он не будет различать их. – alkis

ответ

1

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

select * from employee where TRIM(email_address) is null

Причина, почему вышеупомянутые работы, и это не

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

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

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

Смотрите это для более Why does Oracle 9i treat an empty string as NULL?

+0

Мне не нужны оценки, мне просто надоело ... Единственное правильное решение для этого - NVL(). Это пуленепробиваемый, так сказать ... – Art

+0

Ухаживать за разъяснением? – alkis

+1

На самом деле правильным решением было бы определить поле как «varchar2 (60)». Единственный раз, когда нужно использовать символ char (x) ', является то, что вы знаете, что данные всегда будут содержать x символов. Подобно 'char (2)', чтобы содержать двухбуквенные аббревиатуры состояний: «AL», «AK» и т. Д. Или «char (1)», чтобы содержать «Y» или «N». Адреса будут варьироваться в широких пределах, даже если они состоят только из числа и названия улицы. Поэтому поле, содержащее его, должно иметь возможность варьироваться по длине. – TommCatt

2
Select * from employee where NVL(trim(email_address), '*') <> '*'; 
Смежные вопросы