2015-11-17 11 views
2

Я подготовил SQL-запрос, который мне придется запускать в нескольких базах данных (Oracle и Sybase), где некоторые данные могут храниться по-разному.Сравнение строк SQL -how для игнорирования пробелов

Я заметил, что одним из отличий в хранении данных является пустая строка. Например, в колонке PRODUCT_TYPE ниже, пожалуйста, посмотрите на второй записи:

enter image description here

Эта «пустая строка» (тип данных CHAR(15)) обведена красным равно '' в некоторых базы данных, тогда как для некоторых других он равен ' '. Длина никогда не является постоянной и существует несколько полей, которые ведут себя как таковые.

Так, так как мне нужно фильтровать эти «пустые строки», я должен изменить следующее заявление в пункте WHERE:

WHERE PRODUCT_TYPE = '' 

... потому что выше будет принимать ' ' строки в другую, чем '', даже если «функционально» говорить не является. Я хотел бы сделать заявление таким образом, что он «игнорирует пробелы», то есть ' ' равен '', который равен ' ' и т. Д. Как мне сделать это изменение, чтобы заставить его работать?

Я попытался простой заменяющий подход:

WHERE REPLACE(PRODUCT_TYPE,' ','') = '' 

... но это не похоже на работу, вероятно, потому, что я должен использовать различный характер. Ради тестирования, внутри ' ниже там скопированный вставили пример того, что я нахожу в этих «пустых строк»:

'    ' 

В идеале, это должно быть «неспецифический SQL» решение, так как я должен будет запускать тот же запрос как для Oracle, так и для Sybase RDBMS. Есть идеи?

+0

Почему он должен быть точно такой же запрос для обеих баз данных? – Thilo

+1

Если 'REPLACE (PRODUCT_TYPE, '', '')' не удаляет все пробелы, тогда у вас есть другой символ, чем пробел, например, возврат каретки или вкладка или какой-либо другой непечатаемый символ. – Atri

+0

@ Тило это только вопрос того, как результаты придут. Если мы запускаем два типа запросов (один для всех баз данных Oracle и один для всех Sybase, мы получим два отдельных файла для анализа). Разве невозможно сделать инструкцию IF Oracle ELSE? Я признаю, что я не очень хорошо разбираюсь в SQL, мне понравилось бы ваше одобрение. –

ответ

2

Вы можете использовать trim на колонке.

where trim(product_type) is null 

, приведенное выше, не СУБД-независимый, так как Sybase не обеспечивает функцию trim. Тем не менее, ниже подход будет работать как в Sybase и Oracle:

where rtrim(ltrim(product_type)) is null 
+0

Спасибо VKP. Это сработало, и это подход, которым я буду следовать, поскольку он является наиболее читаемым. –

+0

Делает ли это «обрезать до NULL» на Sybase? – Thilo

+0

@ На самом деле, это говорит мне, что «Функция» обрезка «не найдена». Мне придется попробовать подход REPLACE, хотя я предпочел это. –

2

Вы можете использовать КЕРЪАСЕ вы пробовали, но вы должны проверить «равно нулю» вместо = «»

WHERE REPLACE(PRODUCT_TYPE,' ','') is null 

Смотрите также: null vs empty string in Oracle

+0

Спасибо Рене, что сработало. Я предпочитаю решение vkp, используя 'trim' (только для чтения), но большое спасибо за вашу помощь. Это по-прежнему действительный ответ, я бы принял его, если бы смог принять 2 :) –

2

Простой (и не- СУБД специфический) ответ:

У не использования CHAR(15).

char(n)фиксированный длина данные type. Поэтому, независимо от того, что вы храните там, значение всегда будет дополняться определенной длиной. Если вы храните один символ, СУБД будет хранить этот единственный символ и 14 пробелов.

Измените свои колонки, чтобы использовать varchar(15), и у вас не должно быть никаких проблем.

+1

И наоборот, как получилось, что в 'char (15) существует одно пространство? – Thilo

+2

@Thilo: _theoretically_ он не может, но некоторые СУБД не соответствуют стандарту ANSI и не делают ** не ** накладывают сохраненные значения на определенную длину (Microsoft и Sybase приходят на ум). Но никакие СУБД я не знаю о колодках столбца 'varchar' до определенной длины –

+1

OTOH, в Oracle пустая строка не может быть сохранена вообще (она становится NULL). Не намного лучше. – Thilo

Смежные вопросы