SQL - Как удалить символ пробела из строки - PullRequest
0 голосов
/ 03 октября 2019

У меня есть таблица, где максимальная длина столбца (varchar) равна 12, кто-то загрузил какое-то значение с пробелом, поэтому вместо «ПРОБЕЛ» это «ПРОБЕЛ»

Я хочу удалитьпробел, используя скрипт, я был уверен, что RTRIM или REPLACE (myValue, '', '') будут работать, но LEN (myValue) показывает, что есть еще и дополнительный символ?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Как уже упоминалось парой людей, это может быть не пробел. Возьмите копию ngrams8k , и вы используете ее для выявления проблемы. Например, здесь у нас есть текст «ПРОБЕЛ» с предшествующим пробелом и завершающим символом CHAR (160) (тег HTML BR). CHAR (160) выглядит как пробел в SSMS, но не является "тримблируемым". Например, рассмотрим этот запрос:

DECLARE @string VARCHAR(100) = ' SPACE'+CHAR(160);
SELECT '"'+@string+'"'

Используя ngrams8k , вы можете сделать это:

DECLARE @string VARCHAR(100) = ' SPACE'+CHAR(160);

SELECT
  ng.position,
  ng.token,
  asciival = ASCII(ng.token)
FROM   dbo.ngrams8k(@string,1) AS ng;

Возвращает:

position   token   asciival
---------- ------- -----------
1                  32
2          S       83
3          P       80
4          A       65
5          C       67
6          E       69
7                  160

Как видите, первый символ (позиция 1) - это CHAR (32), это пробел. Последний символ (позиция 7) не является пробелом. Зная, что CHAR (160) - это проблема, вы можете решить ее следующим образом:

SET @string = REPLACE(LTRIM(@string),CHAR(160),'')

Если вы используете SQL Server 2017+, вы также можете использовать TRIM, что делает намного больше, чем просто LTRIM-и-RTRIM-ки. Например, это удалит начальные и конечные вкладки, пробелы, возврат каретки, возврат строки и теги HTML BR.

SET @string = SELECT TRIM(CHAR(32)+CHAR(9)+CHAR(10)+CHAR(13)+CHAR(160) FROM @string)
0 голосов
/ 03 октября 2019

Скорее всего, это какой-то другой непечатный символ, возврат каретки является большим при переходе между * nix и другими ОС. Один из способов сказать это - использовать функцию DUMP. Поэтому вы можете начать с запроса, подобного следующему:

SELECT dump(column_name)
FROM your_table
WHERE column_name LIKE 'SPACE%'

Это должно помочь вам найти оскорбительный символ, однако это не решит вашу проблему. Вместо этого я бы использовал что-то вроде REGEXP_REPLACE:

SELECT REGEXP_REPLACE(column_name, '[^A-z]')
FROM your_table

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

SELECT REGEXP_REPLACE(column_name, '[:cntrl:]')
FROM your_table
...