sql >> Database >  >> RDS >> Database

T-SQL Stuff-opdracht

Het belangrijkste idee rond de SQL Server-functie genaamd STUFF is het samenvoegen van meerdere kolommen in een enkele kolom met meer flexibiliteit dan de CONCAT-functie zou bieden. Bovendien kan STUFF worden gecombineerd met andere technieken voor een aantal interessante effecten.

In dit artikel onderzoeken we de mogelijkheden die het STUFF-commando biedt voor SQL Database-specialisten.

De T-SQL STUFF-functie

Laten we eerst eens kijken naar de officiële Microsoft-definitie van de STUFF-functie:

De STUFF-functie voegt een string in een andere string in. Het verwijdert een gespecificeerde lengte van tekens in de eerste tekenreeks op de startpositie en voegt vervolgens de tweede tekenreeks in de eerste tekenreeks op de startpositie in.

Dus wanneer u het STUFF-commando gebruikt, herschikt u de kolomgegevens.

Laten we een paar voorbeelden bekijken.

De eerste is de uitvoer van het STUFF-commando - de originele ABCDEFG-reeks wordt gevuld met de XXX-reeks.

SELECT STUFF('ABCDEFG',3,3,'XXX');

We zullen deze uitvoer analyseren om het STUFF-commando volledig te begrijpen:

Nu wordt de derde parameter verhoogd tot waarden van 4,5,6.

SELECT STUFF('ABCDEFG',3,4,'XXX');
SELECT STUFF('ABCDEFG',3,5,'XXX');
SELECT STUFF('ABCDEFG',3,6,'XXX');

Uitleg functie-oproep

De vervanging gebeurt bij het derde teken van de originele ABCDEFG-reeks in elke uitvoering. Het enige verschil is het aantal tekens dat is opgegeven om te verwijderen via de parameter delete length .

Dus, wanneer de verwijder lengte parameter vanaf de startpositie parameter langer is dan de originele string, worden de gegevens afgekapt.

Onze originele tekenreeks is bijvoorbeeld 7 tekens lang. De STUFF-functie begint op positie 3 en duurt nog 5 tekens. Aangezien 8 meer is dan de oorspronkelijke tekenreekslengte van 7, wordt de waarde geretourneerd als ABXXX.

Meervoudig gebruik van STUFF in dezelfde zoekopdracht

U kunt de STUFF-opdracht in een andere STUFF-opdracht nesten en deze zo vaak gebruiken als nodig is. U moet echter overwegen hoe dit de query's op productieniveau beïnvloedt. Elke geneste oproep wordt uitgevoerd voor elke rij van de geretourneerde gegevens.

SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;

In dit voorbeeld wordt het eerste teken van de originele tekenreeks vervangen door het 1-teken en het laatste wordt vervangen door het 7-teken.

STUFF en ForXML

ForXML is een functie in SQL Server die de resultatensets van SQL-query's kan omzetten in resultaten in XML-indeling.

STUFF kan ook worden gecombineerd met andere SQL Server-functionaliteit zoals ForXML. Het helpt bij het consolideren van gegevens voor rapportagedoeleinden. Laten we de volgende tabelstructuur nemen:

Stel, u wilt een rapport met 2 kolommen. De eerste kolom is USER_NAME , en de tweede is een door komma's gescheiden rol kolom voor elke rol die de gebruiker heeft. Hoe kon dit worden bereikt in pure T-SQL?

Bouw de tabelstructuur en voeg gegevens in:

CREATE TABLE 
#USER
(
USER_ID INT,
USER_NAME VARCHAR(50)
)

CREATE TABLE
#USER_ROLES
(
USER_ID INT,
ROLE VARCHAR(50)
)


INSERT INTO #USER VALUES(1,'Edward')
INSERT INTO #USER VALUES(2,'John')
INSERT INTO #USER VALUES(3,'Mark')

INSERT INTO #USER_ROLES VALUES(1,'Admin')
INSERT INTO #USER_ROLES VALUES(1,'Writer')
INSERT INTO #USER_ROLES VALUES(1,'Form')
INSERT INTO #USER_ROLES VALUES(2,'Writer')
INSERT INTO #USER_ROLES VALUES(3,'Form')
INSERT INTO #USER_ROLES VALUES(3,'Writer');

Gebruik het STUFF-commando:

SELECT 
   U.USER_NAME,
   STUFF((SELECT ',' + UR.ROLE 
          FROM #USER_ROLES UR
          WHERE UR.USER_ID = U.USER_ID
          FOR XML PATH('')), 1, 1, '') [ROLES]
FROM #USER U
GROUP BY U.USER_NAME, U.USER_ID
ORDER BY 1

In dit voorbeeld wordt een innerlijke query toegevoegd aan elke USER_ID. Het STUFF-commando wordt gebruikt om de beginkomma te vervangen. Als resultaat hebben we een mooie door komma's gescheiden lijst van elke gebruiker met de respectievelijke rollen.

Gebruiksvoorbeelden

Gegevensmaskering

SQL Server biedt oplossingen voor dynamische gegevensmaskering. STUFF kan echter worden gebruikt om gevoelige gegevens te verdoezelen wanneer deze worden weergegeven. Stel je een weergave voor die bovenop een tafel zit met PII-velden voor klanten, zoals SSN. De weergave zou het STUFF-commando kunnen gebruiken om alles te maskeren behalve de laatste 4 cijfers van het SSN.

Gegevensconsolidatie

Zoals aangetoond met FORXML en STUFF, biedt T-SQL de mogelijkheid om gegevens te consolideren in enkele kolommen met een soort primaire identifier. In dit voorbeeld was dit de USER_NAME. Dit type analyse is echter vrij gebruikelijk in de architectuur van databaserapportage.

Samenvatting

We hebben dus de parameters van het STUFF-commando in T-SQL behandeld en begrepen hoe dit commando zich verhoudt tot CONCAT. We demonstreerden zowel eenvoudige als complexe voorbeelden van het STUFF-commando en somden een paar gebruiksscenario's op waarvoor STUFF van toepassing kan zijn.

Het is een waardevol commando dat een geweldig hulpmiddel kan zijn om onder je riem te hebben. Geef commentaar met andere gebruiksscenario's voor het STUFF-commando.


  1. MySQL - Hoe tijden optellen?

  2. Informatie over de information_schema database in MySQL

  3. Wat betekent het als een PostgreSQL-proces inactief is in transactie?

  4. PostgreSQL-anonimisering op aanvraag