Ищите конечные пробелы в таблице - PullRequest
3 голосов
/ 21 декабря 2011

Я хотел бы знать, как я могу определить конечные пробелы в таблице. Я использую SQL Server 2008 и создаю следующую таблицу в качестве теста

CREATE TABLE  first_test_name
   ( 
   firstName varchar(255)
    )

А потом вставил такую ​​запись:

insert into first_test_name (firstName)
values('Bob')

Затем я попытался вставить пробел, а затем добавить новую запись, например:

insert into first_test_name (firstName)
values('Bob ') -- just 1 space

И в третий раз

insert into first_test_name (firstName)
values('Bob  ')   -- two spaces used this time.

Теперь, если я запрашиваю 'Bob' (без пробелов), я все равно получаю счет 3. Мой запрос был:

select count(*) from first_test_name WHERE firstName = 'Bob'

Разве не должен быть ответ 1?

Кроме того, я использовал sp_help в этой таблице, а значение "Trim Trailing Blanks" установлено на №.

Так почему я получаю счет 3? Я ожидал только 1.

В связанной заметке, если я выполняю поиск по этому запросу

select * from first_test_name
where firstName like '% '

Затем я получаю правильный ответ из двух найденных строк.

Так что, повторюсь, вопрос в том, почему я получаю счет 3 при поиске «Боб». Кроме того, что в данном случае означает «Trim Trailing Blanks»?

Ответы [ 6 ]

6 голосов
/ 21 декабря 2011

Почему я получаю счет 3 при поиске 'Bob'?

SQL Server игнорирует конечные пробелы в большинстве сравнений строк.

Кроме того, что означает в этом случае "Trim Trailing Blanks"?

Здесь указывается параметр ANSI_PADDING, установленный при создании таблицы.

Как я могу идентифицировать эти два с 1 или 2 пробелами?

Вот один из способов.

SELECT *
FROM first_test_name 
WHERE firstName LIKE 'Bob '

И найти без пробела

SELECT *
FROM first_test_name 
WHERE firstName LIKE 'Bob' AND firstName NOT LIKE 'Bob '
3 голосов
/ 21 декабря 2011

SQL Server будет расширять строки с пробелами во время сравнений.

Вот что я бы сделал:

SELECT  COUNT(*)
FROM first_test_name
WHERE REPLACE(firstName, ' ', '_') = 'Bob'
2 голосов
/ 10 апреля 2013

ВЫБРАТЬ * ИЗ ПОЛЬЗОВАТЕЛЕЙ, ГДЕ ДАННЫЙ ДЛИНА (имя пользователя) <> ДАННЫЙ ДЛИНА (RTrim (имя пользователя))

1 голос
/ 22 декабря 2011

Хороший чистый способ сделать это - сравнить исходную строку с версией Rtrim, где они не совпадают, например ::100100

SELECT *
FROM First_Test_Name
WHERE Firstname <> RTrim(Firstname)

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

1 голос
/ 21 декабря 2011

Другим способом может быть добавление чего-либо в строку.

declare @test table(
id varchar(4) not null,
firstname varchar(255) not null)

insert into @test values('1', 'Bob')
insert into @test values('2', 'Bob ')
insert into @test values('3', 'Bob  ')
insert into @test values('4', ' Bob')

select count((firstname + 'end')) from @test 
where (firstname + 'end') not like '% %'

Запрос вернет счетчик 1.

0 голосов
/ 07 января 2013

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

https://stackoverflow.com/a/14188944/1953837

LEN обрезает концевые пробелы по умолчанию.Используя приведенное ниже, они перемещаются вперед, а затем подсчитывается длина поля.

Надеюсь, что это поможет любому, кто ищет в будущем.

(LEN (REVERSE (FieldName)) *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...