Jak przyciąć ciąg w SQL Server przed 2017?

134

W programie SQL Server 2017 można używać tej składni, ale nie we wcześniejszych wersjach:

SELECT Name = TRIM(Name) FROM dbo.Customer;
Eric Labashosky
źródło

Odpowiedzi:

242
SELECT LTRIM(RTRIM(Names)) AS Names FROM Customer
Ben Hoffstein
źródło
4
to najłatwiejszy sposób, aby to zrobić, pamiętaj tylko, aby aliasować zwracaną kolumnę
Miles,
2
@Miles - dodałem alias dla kompletności.
Ben Hoffstein
3
Rozumiem, że jest to właściwy sposób przycinania wartości. ale czy możesz wyjaśnić, dlaczego używać zarówno LTRIM, jak i RTRIM, skoro zamiast tego mogliśmy użyć tylko TRIM?
Code Buster
7
@CodeBuster: SQL Server nie ma zdefiniowanej funkcji TRIM, nawet w wersji 2014.
alextansc
8
SQL Server ma teraz TRIM w wersji 2017. docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql
goodeye
65

Aby przyciąć po prawej stronie, użyj:

SELECT RTRIM(Names) FROM Customer

Aby przyciąć po lewej stronie, użyj:

SELECT LTRIM(Names) FROM Customer

Aby przyciąć po obu stronach, użyj:

SELECT LTRIM(RTRIM(Names)) FROM Customer
Kibbee
źródło
7
Nawiasem mówiąc, jaki możliwy powód może mieć firma Microsoft dla włączenia funkcji LTRIM i RTRIM bez TRIM? To dziwne.
Ben Hoffstein,
1
Ponieważ jest zbędny. Możesz osiągnąć to samo dzięki LTRIM (RTRIM (var)).
Kibbee
54
Tak, ale to dwa wywołania funkcji. Można powiedzieć, że wszystkie są zbędne, ponieważ TSQL ma CHARINDEX i SUBSTRING, ale jest to idiotyczny sposób patrzenia na to.
Ben Hoffstein
10
To wcale nie jest zbędne. Brak jednej funkcji zwanej TRIM nakłada na użytkownika ciężar składni.
joelc
4
Prawdopodobnie było to przeoczenie lub jedna z tych funkcji, które zostały zablokowane, ponieważ każda funkcja zaczyna się od -100 punktów (co tak naprawdę prowadzi do niespójnych zestawów funkcji zamiast zestawów funkcji z priorytetami, IMHO).
siride
8

Zakładam, że jest to jednorazowe czyszczenie danych. Po zakończeniu upewnij się, że dodałeś ograniczenia bazy danych, aby zapobiec nieprawidłowym danym w przyszłości, np

ALTER TABLE Customer ADD
   CONSTRAINT customer_names__whitespace
      CHECK (
             Names NOT LIKE ' %'
             AND Names NOT LIKE '% '
             AND Names NOT LIKE '%  %'
            );

Rozważ także zablokowanie innych znaków (tabulatora, powrotu karetki, nowego wiersza itp.), Które mogą powodować problemy.

Może to być również dobry moment, aby podzielić te nazwy się family_name, first_nameitp :)

onedaywhen
źródło
5
SELECT LTRIM(RTRIM(Replace(Replace(Replace(name,'   ',' '),CHAR(13), ' '),char(10), ' ')))
from author
razon
źródło
1

w SQL Server 2008 R2 z wyrażeniem ssis mamy funkcję trim.

SQL Server Integration Services (SSIS) to składnik oprogramowania bazy danych Microsoft SQL Server, którego można używać do wykonywania szerokiego zakresu zadań migracji danych.

pełny opis można znaleźć pod tym linkiem

http://msdn.microsoft.com/en-us/library/ms139947.aspx

ale ta funkcja sama w sobie ma pewne ograniczenia, o których również wspomina msdn na tej stronie. ale to jest w SQL Server 2008 R2

TRIM("   New York   ") .The return result is "New York".
rahularyansharma
źródło
4
Nie ma to nic wspólnego z MS SQL poza tym, że znajduje się w produkcie dołączonym do bazy danych.
siride
0

Rozszerzona wersja „REPLACE”:

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE("Put in your Field name", ' ',' '))),'''',''), CHAR(9), ''), CHAR(10), ''), CHAR(13), ''), CHAR(160), '') [CorrValue]
Kai-Ove Böhnisch
źródło
0

Aby przyciąć dowolny zestaw znaków od początku i końca ciągu, możesz wykonać następujący kod, w którym @TrimPattern definiuje znaki do przycięcia. W tym przykładzie przycinane są znaki spacji, tabulacji, LF i CR:

Zadeklaruj @Test nvarchar (50) = Concat ('', char (9), char (13), char (10), '', 'TEST', '', char (9), char (10), char ( 13), '', 'Test', '', znak (9), '', znak (9), znak (13), '')

ZADEKLARUJ @TrimPattern nvarchar (max) = '% [^' + char (9) + char (13) + char (10) + ']%'

WYBIERZ SUBSTRING (@Test, PATINDEX (@TrimPattern, @Test), LEN (@Test) - PATINDEX (@TrimPattern, @Test) - PATINDEX (@TrimPattern, LTRIM (REVERSE (@Test))) + 2)

Reejuta Sharmin
źródło