Обрезать лишние пробелы внутри столбца - PullRequest
2 голосов
/ 22 апреля 2019

У меня есть следующий выбор, который преобразует имя из формата Lastname, Firstname в формат Firstname Lastname. Кажется, добавляется дополнительный пробел между именем и фамилией

SELECT substring(D.NAME, charindex(',', replace(D.NAME, ' ', '')) + 1, len(D.NAME)) 
        + ' ' 
        + left(D.NAME, charindex(',', D.NAME) -1) AS First_Last
FROM TEST_TABLE D

Вот несколько примеров вывода, который я получаю сейчас:

Johnnyyy            Smithsonnn
Kimmey       Test1
Denise          Stuffing

Желаемый формат (один пробел между именем и фамилией):

Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing

Ответы [ 4 ]

3 голосов
/ 22 апреля 2019

Мне нравится эта техника. В этом примере мы используем редкий шаблон замены †‡, но вы можете использовать <> и ><

Примечание: внешний ltrim(rtrim( ... )) является необязательным, я сохраняю его как «на всякий случай».

Пример

Select NewValue = ltrim(rtrim(replace(replace(replace([Name],' ','†‡'),'‡†',''),'†‡',' ')))
 From  YourTable 

Возвращает

NewValue
Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing
2 голосов
/ 22 апреля 2019

Может быть имена с или без , или с пробелами или без них после ,, или другие несоответствия.В любом случае вы можете использовать ltrim(rtrim()) перед объединением:

select 
  case 
    when d.name like '%,%' then
      ltrim(rtrim(substring(d.name, charindex(',', name) + 1, len(d.name))))
      + ' ' +
      ltrim(rtrim(left(D.NAME, charindex(',', d.name) -1))) 
    when d.name like '% %' then  
      ltrim(rtrim(substring(d.name, charindex(' ', name) + 1, len(d.name))))
      + ' ' +
      ltrim(rtrim(left(D.NAME, charindex(' ', d.name) -1))) 
    else ltrim(rtrim(d.name))
 end AS First_Last 
0 голосов
/ 22 апреля 2019

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

SELECT (replace(left(D.NAME, charindex(',', D.NAME + ',') + 1), ' ', '') +
        ' ' +
        left(D.NAME, charindex(',', D.NAME + ',') - 1)
       ) AS First_Last
FROM TEST_TABLE D;

Также добавляется запятая для charindex(), поэтому запятая необязательна.

0 голосов
/ 22 апреля 2019

Попробуйте:

select ltrim(rtrim(left(D.NAME, charindex(',', D.NAME, 0) - 1)))
  + ' ' 
  + ltrim(rtrim(right(D.NAME, len(D.NAME) - charindex(',', D.NAME, 0))))
from TEST_TABLE D 

Это сработало на некоторых тестовых данных, которые я использовал ниже:

insert into #Test ([Name]) values ('Johnnyyy, Smithsonnn')
insert into #Test ([Name]) values ('Kimmey, Test1')
insert into #Test ([Name]) values ('Denise, Stuffing')

Что дает ожидаемый результат:

Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing
...