sql >> Database >  >> RDS >> Sqlserver

SQL Server TRIM-, LTRIM- en RTRIM-functies

De TRIM-functie van SQL Server is ontworpen om voorloop- en volgspaties uit een tekenreeks te verwijderen. Een voorloopspatie is een witruimte die vóór de eigenlijke tekenreeks voorkomt. Een volgspatie treedt op na.

In dit artikel gaan we de TRIM-functie onderzoeken en het gebruik ervan illustreren met praktische voorbeelden. Laten we dus beginnen bij de basis.

TRIM-functie in SQL Server

SQL TRIM is een ingebouwde functie waarmee we de onnodige tekens aan beide zijden van de string met één handeling kunnen trimmen. Meestal gebruiken we het om spaties te verwijderen. Deze functie verscheen in SQL Server 2017 en is nu ook aanwezig in Azure SQL Database.

De syntaxis van de SQL TRIM-functie is als volgt:

TRIM ( [ karakters FROM ] string )

  • tekens VAN is een optioneel parameter die bepaalt welke tekens we moeten verwijderen. Standaard is deze parameter van toepassing op spaties aan beide zijden van onze string.
  • string is een verplicht parameter die de string bepaalt waar we spaties/andere onnodige tekens moeten verwijderen.

De geretourneerde uitvoer is een tekenreeks zonder die tekens waarvan we hebben vastgesteld dat ze aan het begin en het einde moeten worden bijgesneden. Zie het voorbeeld:

SELECT TRIM( ' example ') AS Result;

De uitvoer is:

voorbeeld

Zoals we al zeiden, kan de TRIM-functie ook andere tekens verwijderen. Bekijk het voorbeeld waarin we de string willen opschonen van onnodige tekens en spaties:

SELECT TRIM( '.,# ' FROM '# ! example .') AS Result;

De uitvoer is:

! voorbeeld

De SQL TRIM-functie is beschikbaar in SQL Server vanaf versie 2017, maar het was ook mogelijk om de taak vóór die release uit te voeren. Gebruikers kunnen SQL LTRIM apply toepassen en SQL RTRIM functies. Ze zijn aanwezig in alle ondersteunde versies van SQL Server.

LTRIM-functie in SQL Server

De SQL LTRIM functie dient om onnodige spaties aan de linkerkant van de tekenreeks te verwijderen. De syntaxis is als volgt:

LTRIM( string )

tekenreeks is de verplichte parameter die de doelreeks van tekens specificeert die we aan de linkerkant moeten inkorten. De uitvoer is een kopie van de opgegeven tekenreeks, maar zonder de spaties aan het begin:

SELECT LTRIM('   SQL Function');

Uitgang:

‘SQL-functie’

RTRIM-functie in SQL Server

De SQL RTRIM functie werkt op dezelfde manier als LTRIM - het verschil is dat het spaties aan de rechterkant van de tekenreeks verwijdert. De syntaxis is hieronder:

RTRIM(tekenreeks)

tekenreeks is de vereiste parameter die verwijst naar de tekenreeks waar we de volgspaties moeten verwijderen.

SELECT RTRIM('SQL Server   ');

Uitgang:

‘SQL-server’

LTRIM en RTRIM samen gebruiken

Als we met SQL Server werken, hoeven we vaak alleen spaties aan één kant van de tekenreeks te verwijderen. Toch zijn er gevallen waarin we de string aan beide kanten moeten wissen. De TRIM-functie die we eerder hebben beschreven, dient dat doel, maar, zoals we ons herinneren, is deze alleen beschikbaar in SQL Server 2017 en hoger.

Is er een manier om zowel de voorloop- als de volgspaties voor één string te verwijderen zonder de TRIM-functie? Ja. We kunnen LTRIM en RTRIM samen in één zoekopdracht gebruiken.

De syntaxis is:

LTRIM(RTRIM(string))

tekenreeks definieert die doelreeks met tekens die we aan beide zijden willen verwijderen van onnodige spaties. Merk ook op dat we LTRIM en RTRIM in willekeurige volgorde kunnen plaatsen .

SELECT LTRIM(RTRIM('   SQL Server  '));

Uitgang:

‘SQL-server’

Nu we de essentie van al deze SQL-functies (TRIM, LTRIM en RTRIM) hebben verduidelijkt, gaan we dieper duiken.

Waarom witruimten belangrijk zijn

Je kunt je afvragen waarom het belangrijk kan zijn om dergelijke spaties te verwijderen. Simpel gezegd, omdat ze hinderlijk kunnen zijn bij bijvoorbeeld het vergelijken van waarden. Witruimte zelf wordt beschouwd als een onderdeel van een tekenreeks als het er is, dus het is beter om je zorgen te maken over dergelijke problemen.

Laten we deze functies eens goed onderzoeken.

Eerst maken we een eenvoudige tabel voor de databasetypen die in onze onderneming worden uitgevoerd. Onze tabel heeft drie kolommen. De eerste is de ID-kolom die nodig is om elke rij uniek te identificeren. De tweede is DBTypeNameA . De derde is de DBTypeNameB .

De laatste twee kolommen verschillen per gegevenstype. DBTypeNameA gebruikt eerst de VARCHAR gegevenstype, en DBTypeNameB gebruikt de CHAR gegevenstype.

Voor beide kolommen kennen we de gegevenslengte van 50 toe.

- Listing 1: Create a Simple Table
USE DB2
GO
CREATE TABLE DBType (
ID INT IDENTITY(1,1)
,DBTypeNameA VARCHAR (50)
,DBTypeNameB CHAR (50))

GO

Let op het verschil tussen deze gegevenstypen.

  • Voor de VARCHAR-kolom wijst SQL Server niet de ruimte toe voor 50 tekens die we in de kolom ab initio verwachten. We zeggen dat de kolom moet voorzien in een maximum van 50 tekens, maar wijs indien nodig ruimte toe.
  • Voor de CHAR-kolom wordt die voorziening gemaakt voor 50 tekens telkens wanneer een rij wordt ingevoegd, ongeacht of de werkelijke waarde die spatie nodig heeft of niet.

Het gebruik van VARCHAR (variabele tekens) is dus een manier om ruimte te besparen.

Nadat we de tabel hebben gemaakt, vullen we deze in met behulp van de code in Listing 2.

-- Listing 2: Populate the Table
USE DB2
GO
INSERT INTO DBType VALUES ('SQL Server','SQL Server');
INSERT INTO DBType VALUES (' SQL Server ',' SQL Server ');
INSERT INTO DBType VALUES ('  SQL Server  ','  SQL Server  ');
INSERT INTO DBType VALUES ('Oracle','Oracle');
INSERT INTO DBType VALUES (' Oracle ',' Oracle ');
INSERT INTO DBType VALUES ('  Oracle  ','  Oracle  ');
INSERT INTO DBType VALUES ('MySQL','MySQL');
INSERT INTO DBType VALUES (' MySQL ',' MySQL ');
INSERT INTO DBType VALUES ('  MySQL  ','  MySQL  ');

Bij het vullen van onze tabel hebben we bewust waarden ingevoerd met voorloop- en volgspaties. We gebruiken ze in onze demonstratie.

Wanneer we de tabel doorzoeken (zie Lijst 3), kunnen we de "vervorming" in de gegevens zien zoals weergegeven in SSMS (Figuur 1).

-- Listing 3: Query the Table
USE DB2
GO
SELECT * FROM DBType;

Deze vervorming is zichtbaar omdat we leidende ruimtes hebben. Achterliggende spaties zijn op deze manier moeilijker te visualiseren.

De vraag is Listing 4 biedt een diepere kijk op deze 'vervorming'. Het introduceert de LEN- en DATALENGTH-functies:

  • LEN() retourneert het aantal tekens in een tekenreeks, exclusief volgspaties.
  • DATALENGTH() geeft het aantal bytes terug dat wordt gebruikt om een ​​uitdrukking weer te geven.
-- Listing 4: Query the Table
USE DB2
GO
SELECT DBTypeNameA
, LEN(DBTypeNameA) LenVarcharCol
, DATALENGTH(DBTypeNameA) DataLenVarcharCol
, DBTypeNameB
, LEN(DBTypeNameB) LenCharCol
, DATALENGTH(DBTypeNameB) DataLenCharCol
FROM DBType;

Afbeelding 2 toont ons variaties in lengte voor uitdrukkingen als "SQL Server", "Oracle" en "MySQL" vanwege de voorloop- en volgspaties.

Dit houdt in dat deze expressies niet hetzelfde zijn voor zover het de SQL Server-query-engine betreft. We kunnen dit duidelijk zien door de code in Listing 5 uit te voeren.

-- Listing 5: Query for Specific 
USE DB2
GO
SELECT * FROM DBType WHERE DBTypeNameA='SQL Server';
SELECT * FROM DBType WHERE DBTypeNameA='Oracle';
SELECT * FROM DBType WHERE DBTypeNameA='MySQL';

De DataLenCharCol veld vertegenwoordigt de uitvoer van de functie DATALENGTH() in de CHAR-kolom. Daarom is een gevolg van dit verschil tussen "SQL Server" en "SQL Server" het queryresultaat dat wordt weergegeven in figuur 3.

We zien dat hoewel we drie rijen hebben met elk databasetype, onze query's slechts één van elk retourneren omdat voorloop- en volgspaties de waarden onderscheiden.

Het probleem oplossen

Het verkrijgen van de juiste resultaten voor de zoekopdracht in Listing 5 is haalbaar en eenvoudig. We hebben de SQL Server TRIM()-functie nodig zoals getoond in Listing 6.

-- Listing 6: Query for Specific 
USE DB2
GO
SELECT * FROM DBType WHERE TRIM(DBTypeNameA)='SQL Server';
SELECT * FROM DBType WHERE TRIM(DBTypeNameA)='Oracle';
SELECT * FROM DBType WHERE TRIM(DBTypeNameA)='MySQL';

Zonder deze TRIM()-functie kunnen we in sommige scenario's verkeerde resultaten krijgen.

We kunnen verder gaan door gegevens in een aparte tabel te laden, ervan uitgaande dat we het probleem permanent willen oplossen (een soort gegevensopschoning).

-- Listing 7: Query for Specific 
USE DB2
GO
SELECT ID, TRIM(DBTypeNameA) DBTypeNameA, TRIM(DBTypeNameB) DBTypeNameB FROM DBType;

Vergelijk de resultaten van Listing 7 (Figuur 5) met die van Listing 3 (Figuur 1). We kunnen ook een andere tabel maken met deze resultatenset om de gegevens op te schonen (zie Lijst 8).

-- Listing 8: Create a New Table (Data Cleanup)
USE DB2
GO
SELECT ID, TRIM(DBTypeNameA) DBTypeNameA, TRIM(DBTypeNameB) DBTypeNameB INTO DBType_New FROM DBType;

SELECT * FROM DBType_New;

Op deze manier kunnen we onze problemen permanent oplossen en de overhead van het uitvoeren van functies verwijderen telkens wanneer we gegevens uit onze tabel moeten halen.

Conclusie

De SQL Server TRIM()-functies kunnen worden gebruikt om zowel voorloop- als volgspaties uit tekenreeksen te verwijderen. LTRIM en RTRIM zijn twee varianten van deze functie die zich richten op respectievelijk voorloop- (LINKS) en volgspaties (RECHTS).

We kunnen TRIM() direct toepassen om de resultatenset op te ruimen en ervoor te zorgen dat we de juiste resultatenset krijgen. We kunnen het ook gebruiken om spaties te verwijderen terwijl we de gegevens netjes van de ene tabel naar de andere verplaatsen.

Gerelateerde artikelen

Hoe tekenreeksen als een professional te ontleden met de functie SQL SUBSTRING()?


  1. Entity Framework 6 met Npgsql

  2. DATEADD-equivalent in PostgreSQL

  3. Is de volgorde van tabellen in een join van belang, wanneer LEFT (outer) joins worden gebruikt?

  4. Hoe de prestaties van MySQL en MariaDB te benchmarken met SysBench