Raghu S Gowda Ответов: 4

Удаление пробелов между словами с помощью sql-запроса


привет,
я извлекаю данные из базы данных, добавляя 2 столбца как один столбец bt в извлеченном столбце есть много пробелов между словами, так как удалить пробелы, кроме одного пробела,

вот как выглядит мой запрос:
select Pers_FirstName + Pers_LastName as Name from Person inner join PhoneLink on Pers_PersonId=PLink_RecordID inner join Phone on Phon_PhoneId=PLink_PhoneId and Phon_Number='6983000';


выход:
Имя
Питер Джексон

Заранее спасибо.

Отредактировано:опечатка

4 Ответов

Рейтинг:
2

Maciej Los

Решение 2 предоставлено компанией Мика Венделиус[^] очень хорошо. Я бы предложил использовать КТОС[^]:


DECLARE @tmp TABLE(MyText VARCHAR(500))

INSERT INTO @tmp (MyText)
VALUES('This    is      very  strange      text...'),
('This    is   another   very  strange      text.'),
('This    is      very  stupid      text   !!!')

DECLARE @words TABLE(RowNo INT, PartNo INT, MyWord VARCHAR(255))

;WITH CTE AS
(
	SELECT ROW_NUMBER() OVER(ORDER BY MyText) AS RowNo, 1 AS PartNo, LEFT(LTRIM(MyText), CHARINDEX(' ', LTRIM(MyText))-1) AS MyWord, RIGHT(LTRIM(MyText), LEN(LTRIM(MyText)) - CHARINDEX(' ', LTRIM(MyText))) AS Remainder
	FROM @tmp
	WHERE CHARINDEX(' ', LTRIM(MyText))>0
	UNION ALL
	SELECT RowNo, PartNo + 1 AS PartNo, LEFT(LTRIM(Remainder), CHARINDEX(' ', LTRIM(Remainder))-1) AS MyWord, RIGHT(LTRIM(Remainder), LEN(LTRIM(Remainder)) - CHARINDEX(' ', LTRIM(Remainder))) AS Remainder
	FROM CTE
	WHERE CHARINDEX(' ', LTRIM(Remainder))>0
	UNION ALL
	SELECT RowNo, PartNo + 1 AS PartNo, LTRIM(Remainder) AS MyWord, NULL AS Remainder
	FROM CTE
	WHERE CHARINDEX(' ', LTRIM(Remainder))=0
)
INSERT INTO @words (RowNo, PartNo, MyWord)
SELECT RowNo, PartNo, RTRIM(LTRIM(MyWord)) AS MyWord
FROM CTE 
ORDER BY RowNo, PartNo 

--SELECT *
--FROM @words 
--ORDER BY RowNo, PartNo 

SELECT DISTINCT t2.RowNo, 
            (
                SELECT t1.MyWord + ' ' AS [text()]
                From @words AS t1
                Where t1.RowNo = t2.RowNo 
                ORDER BY t1.PartNo
                For XML PATH ('')
            ) AS MySentence
        From @words AS t2


Результат:
RowNo	MySentence
1	    This is very strange text... 
2	    This is very stupid text !!! 
3	    This is another very strange text. 


Рейтинг:
1

Wendelius

Чтобы добавить к ответу Кинга Фишера, если несколько пробелов находятся внутри одного текстового столбца и/или вы хотите, чтобы один пробел остался, используйте ЗАМЕНЯТЬ[^] функция. Рассмотрим следующие примеры

SELECT REPLACE('A B'  , '  ', ' ');
SELECT REPLACE('A  B' , '  ', ' ');;

Проблема в том, что если у вас есть более двух пробелов, то REPLACE заменит двойные пробелы только один раз. Для этого вы можете либо построить небольшой UDF, либо повторить замену столько раз, сколько потребуется. Например
SELECT REPLACE( REPLACE( REPLACE('A     B', '    ', ' '), '   ', ' '), '  ', ' ');


Raghu S Gowda

Спасибо, что вы его получили.

Wendelius

Рад, что это помогло

Maciej Los

+5!

Wendelius

Спасибо :)

Рейтинг:
1

King Fisher

Пользователь TRIM Функция удаления пробелов
ОТДЕЛКА[^]

RTEIM[^]

Помните[^]


Maciej Los

Король, ОП хочет удалить ненужные пробелы между словами...

Рейтинг:
1

JIYAUL MUSTAPHA

 DECLARE @str varchar(150)
SET @str='Hello    Welcome     to     codeproject.com'
Select REPLACE(REPLACE(REPLACE(@str,' ','{}'),'}{',''),'{}',' ')