2012-04-11 2 views
3

я хав имя столбца, который является VARCHARSql Server - Альтернатива делать RTRIM/LTRIM в котором положение

Я хочу, чтобы отфильтровать все результаты, где имя является пустой строкой ...

select name 
from tblNames 
where name <> '' 

То, что я хочу сделать, это:

select name 
from tblNames 
where Ltrim(RTrim(name)) <> '' 

Я хочу, чтобы применить облицовку на имя в ИНЕКЕ, но я прочитал несколько статей с упоминанием проблемы производительности функций внутри где п

Я хочу, чтобы решение этой проблемы, не повреждая производительность

+0

Просто, чтобы быть ясным - есть ли у вас записи, которые представляют собой пробелы, то есть больше, чем просто пустую строку? – kaj

+0

Он может также пустые строки, а также нули и пробелы. – abbas

+0

Ну, есть следующие варианты с точки зрения содержания: 1. nulls 2. Пустые строки 3. Пространства только 4. Данные с дополнительными пробелами. Если вы пытаетесь избежать только 1 и 2, вы можете сделать 'where name <> '', а имя не равно null - в некоторых установках, которые также игнорируют 3. Но если вы хотите явно избегать 3, удалив пробелы, тогда вам, вероятно, нужна функция. 'где name <> ''' игнорирует нули в определенной конфигурации, поэтому может быть достаточно – kaj

ответ

10

Стандартное поведение в SQL-сервера является то, что

'  ' = '' 

является TRUE, потому что конечные пробелы игнорируются. От MSDN support:

SQL Server следует ANSI/ISO SQL-92 спецификации (раздел 8.2, Общие правила # 3) о том, как сравнивать строки с пробелами. Стандарт ANSI требует заполнения для символьных строк, используемых в сравнении, чтобы их длины совпадали перед их сравнением. Заполнение напрямую влияет на семантику префиксов предложения WHERE и HAVING и других сравнений строк Transact-SQL. Например, Transact-SQL рассматривает строку 'abc' и 'abc ' быть эквивалентен для большинства операций сравнения.

Единственным исключением из этого правила является предикат LIKE. ...

Итак, ваше состояние WHERE name <> '' должно работать нормально и не содержать никаких строк, где есть только пробелы.

4

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

Вы можете сделать указатель на LTRIM(RTRIM(name)). SQL Может быть достаточно умным, чтобы использовать его.

Вы можете сделать вычисленное поле LTRIM(RTRIM(name)), проиндексировать это поле, а затем использовать это поле в своем запросе.

+0

полностью правильный. +1 – usr

0

В то время как

'abc' = 'abc '

(с пробелами после строки на правой стороне equasion) является TRUE

'abc' = ' abc'

(с пробелами перед строкой в ​​правой части равенства) - FALSE.

Поэтому то, что автоматически игнорируется, это только конечные пробелы (работает как RTRIM, но не как LTRIM).