Определение значений, у которых есть пробел

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

ID      NAME
1002    Total Cost         
1003    Market Price       
1004    Total Cost         
1005    Total Cost         
1006    Sales Price        
1007    Gross Price        
1008    Gross Price

В нашем пользовательском интерфейсе у нас есть страница, на которой мы видим отдельные имена из приведенной выше таблицы. Проблема в том, что для «Общая стоимость» мы видим две записи - одну с именем «Общая стоимость», а другую - с именем «Общая стоимость» (т.е. с одним дополнительным пробелом в конце). Я не могу определить, где находится лишнее пространство.

Я всегда вижу 3 записи Когда я выполняю запрос ниже, независимо от того, сколько лишних пробелов в конце.

SELECT * FROM AB_MASTER_DATA WHERE NAME LIKE '%Total Cost   %'

Как я могу определить неверные данные?

Мы используем MS SQL 2014.

Найдите LTRIM и RTRIM

dfundako 10.08.2018 15:20

возможно, вам придется проверить завершающие управляющие символы, например, char (10), char (13) и т. д. Взгляните на stackoverflow.com/questions/42958278/…

John Cappelletti 10.08.2018 15:25

@dfundako почему? Не влияет на уникальность ...

gbn 10.08.2018 15:35

Зависит от того, что вы считаете «неверными данными». Какой именно результат вы пытаетесь получить?

Tab Alleman 10.08.2018 15:48
0
4
130
4

Ответы 4

Проблема в вашем пользовательском интерфейсе, куда вы добавляете данные. Вы должны ОБРЕЗАТЬ свои данные, если хотите обезопасить себя от конечных и конечных пробелов. Но также у вас могут быть проблемы со строками в верхнем / нижнем регистре, поэтому вам также придется управлять этим. Также вы можете использовать

SELECT DISTINCT(*) FROM AB_MASTER_DATA WHERE TRIM(NAME) LIKE 'Total Cost'

Чтобы выбрать только одно из всех, удовлетворяющих условию:

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

WHERE CONCAT(NAME, '<') LIKE '%Total Cost <'

Смысл в том, чтобы объединить некоторые символы после конечных пробелов, чтобы они больше не игнорировались.

  • Вы предполагаете, что это пространство
  • Конечные пробелы не влияют на уникальность, поэтому любое решение с TRIM терпит неудачу

Таким образом, на строку Total Cost не будут влиять обычные пробелы.

Однако есть и «другие пробелы»: TAB, жесткое пространство, CR, LF и т. д.
И мы еще даже не использовали nvarchar

Пример с ограничением UNIQUE для столбцов Name

DECLARE @UniqueTest table (
    ID int NOT NULL IDENTITY (1,1) PRIMARY KEY, 
    UniqueName varchar(100) NOT NULL UNIQUE
)

--OK so far
INSERT @UniqueTest VALUES ('Market Price')
INSERT @UniqueTest VALUES ('Total Cost')

--gives error
--INSERT @UniqueTest VALUES ('Total Cost     ') 

--tab
INSERT @UniqueTest VALUES ('Total' + CHAR(9) + 'Cost')
--hard space
INSERT @UniqueTest VALUES ('Total' + CHAR(160) + 'Cost')
-- TRAILING CR
INSERT @UniqueTest VALUES ('Total Cost' + CHAR(13))

SELECT * FROM @UniqueTest

Чтобы найти строки, которые не простые буквенно-цифровые или пробелы

SELECT * FROM @UniqueTest WHERE UniqueName LIKE '%[^A-Z0-9 ]%'

Вы можете идентифицировать записи, используя:

where name like 'Total Cost_%'

'_' - это подстановочный знак, который соответствует любому символу, но требует наличия символа.

Вы можете идентифицировать символ (если это ASCII), выполнив что-то вроде:

select ascii(substring(name, 11, 1))

Другие вопросы по теме