sql >> Databáze >  >> RDS >> Database

Několik způsobů, jak vložit rozdělené řetězce s oddělovači do sloupce

V tomto článku ukážu několik způsobů, jak rozdělit řetězec s oddělovači a vložit jej do sloupce tabulky na serveru SQL Server. Můžete to udělat pomocí následujících metod:

  1. Převeďte řetězec s oddělovači na XML, použijte XQuery k rozdělení řetězce a uložte jej do tabulky.
  2. Vytvořte uživatelsky definovanou funkci tabulky s hodnotou pro rozdělení řetězce a jeho vložení do tabulky.
  3. Rozdělte řetězec pomocí funkce STRING_SPLIT a vložte výstup do tabulky.

Abych demonstroval výše uvedené metody, dovolte mi připravit demo nastavení. Nejprve vytvořte tabulku s názvem Zaměstnanec v Demodatabázi . K tomu musíme provést následující dotaz:

USE DEMODATABASE 
GO 

CREATE TABLE EMPLOYEE 
  ( 
     ID            INT IDENTITY (1, 1), 
     EMPLOYEE_NAME VARCHAR(MAX) 
  )

Pro toto demo vložíme jména všech zaměstnanců do jednoho řádku a jména zaměstnanců budou oddělena čárkou. K tomu musíme provést následující dotaz:

INSERT INTO EMPLOYEE 
            (EMPLOYEE_NAME) 
VALUES      ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')

Provedením následujícího dotazu ověřte, že data byla vložena do sloupce.

SELECT * 
FROM   EMPLOYEE

Následuje výstup:

Jak jsem uvedl výše, oddělovací řetězec rozdělíme a vložíme do tabulky. Vytvoříme tedy tabulku s názvem Detail_zaměstnance pro uložení odděleného řetězce rozděleného některou z výše uvedených metod.

Chcete-li vytvořit tabulku, spusťte následující kód:

USE DEMODATABASE 
GO 
CREATE TABLE EMPLOYEE_DETAIL 
  ( 
     ID      INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
     EMPNAME VARCHAR(MAX) NOT NULL 
  )

Metoda 1:Použijte funkci STRING_SPLIT k rozdělení oddělovaného řetězce

Použijeme STRING_SPLIT funkce pro rozdělení řetězce do sloupce a jeho vložení do tabulky. Než to uděláme, dovolte mi vysvětlit STRING_SPLIT funkce.

Co je funkce STRING_SPLIT

STRING_SPLIT je funkce s hodnotou tabulky, zavedená v SQL Server 2016. Tato funkce rozděluje řetězec na základě speciálního znaku v řádku a vrací výstup v samostatné tabulce. Tuto funkci můžeme použít u databází, které mají úroveň kompatibility rovnou nebo vyšší než 130.

Funkce STRING_SPLIT přijímá dva parametry a vrací tabulku s oddělenými hodnotami. Následuje syntaxe funkce STRING_SPLIT.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

Ve výše uvedené syntaxi je SPECIALCHARACTER jeden znak, který bude použit k oddělení vstupního řetězce.

Následuje jednoduchý příklad funkce STRING_SPLIT.

DECLARE @STRING VARCHAR(MAX) 
DECLARE @SPECIALCHARACTER CHAR(1) 
SET @STRING='NISARG,NIRALI,RAMESH,SURESH' 
SELECT * 
FROM   STRING_SPLIT (@STRING, ',')

Následuje výstup dotazu:

Jak můžete vidět ve výše uvedeném příkladu, název výstupního sloupce vrácený STRING_SPLIT je „hodnota“. Výstup vrácený funkcí můžeme filtrovat pomocí klauzule WHERE ve sloupci „hodnota“ a také můžeme seřadit pořadí výstupu pomocí ORDER BY klauzule ve sloupci „hodnota“.

Následuje příklad.

Nyní, abychom do tabulky vložili řetězec s oddělovači, provedeme následující úkoly:

  1. Vytvořte proměnnou s názvem @EmployeeName , která obsahuje výstup Zaměstnance stůl. Chcete-li to provést, spusťte následující kód:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Vytvořte další proměnnou s názvem @Separator datového typu char. Tato proměnná obsahuje hodnotu oddělovače, který bude použit k rozdělení řetězců na více hodnot. Chcete-li vytvořit proměnnou a přiřadit hodnotu k oddělovači, spusťte následující kód:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Nyní použijte „STRING_SPLIT ” funkce k rozdělení hodnot jméno_zaměstnance ve sloupci Zaměstnanec tabulky a vložte hodnoty do EMPLOYEENAME stůl. Chcete-li to provést, spusťte následující kód:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Následuje celý skript:

DECLARE @EMPLOYEENAME VARCHAR(MAX) 

SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                    FROM   EMPLOYEE) 
DECLARE @SEPARATOR CHAR(1) 
SET @SEPARATOR=',' 
INSERT INTO EMPLOYEE_DETAIL 
            (EMPNAME) 
SELECT * 
FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Spusťte výše uvedený skript. Skript vloží do tabulky devět řádků. Jakmile jej spustíte, ujistěte se, že byla data vložena do EMPLOYEENAME stůl. Za tímto účelem proveďte následující dotaz:

SELECT * 
FROM   EMPLOYEE_DETAIL

Následuje výstup:

Metoda 2:Rozdělte řetězec pomocí XML a vložte výstup do tabulky

Když chceme rozdělit řetězec s oddělovači, můžeme to udělat pomocí tabulkových funkcí. Jak víme, uživatelsky definované tabulkové funkce jsou náročné na zdroje a je třeba se jim vyhnout. V takových případech nemáme k dispozici mnoho možností. Jak jsem již zmínil, STRING_SPLIT Funkce může být použita pro databáze, které mají úroveň kompatibility vyšší nebo rovnou 130. Za takových okolností je obtížné najít způsob, jak rozdělit řetězec s oddělovači. Pro tento úkol jsme vytvořili jednoduché a efektivní řešení. Řetězec můžeme rozdělit pomocí XML.

V této části tedy vysvětlím kód XML, který lze použít k vložení rozděleného řetězce s oddělovači do různých řádků sloupce.

Celý kód jsem rozdělil do tří kroků.

Krok 1 :Převeďte řetězec s oddělovači do formátu XML. Chcete-li to provést, spusťte následující kód:

USE demodatabase 
go 

DECLARE @xml       AS XML, 
        @QueryData AS VARCHAR(max), 
        @delimiter AS VARCHAR(10) 

SET @QueryData=(SELECT employee_name 
                FROM   employee) 
SET @delimiter =',' 
SET @xml = Cast(( '<EMPNAME>' 
                  + Replace(@QueryData, @delimiter, '</EMPNAME><EMPNAME>') 
                  + '</EMPNAME>' ) AS XML) 

SELECT @XML

Následuje výstup:

Chcete-li zobrazit celý řetězec XML, klikněte na buňku, jak je znázorněno na obrázku výše. Po kliknutí na buňku by měl soubor XML vypadat takto:

<EMPNAME>DULCE </EMPNAME>
<EMPNAME> MARA </EMPNAME>
<EMPNAME> PHILIP </EMPNAME>
<EMPNAME> KATHLEEN</EMPNAME>
<EMPNAME> NEREIDA </EMPNAME>
<EMPNAME> GASTON </EMPNAME>
<EMPNAME> ETTA </EMPNAME>
<EMPNAME> EARLEAN </EMPNAME>
<EMPNAME> VINCENZA</EMPNAME>

Krok 2 :Jakmile je řetězec převeden na XML, použijte X-Query k dotazu na soubor XML. Chcete-li to provést, spusťte následující kód:

USE DEMODATABASE 
GO 

DECLARE @XML       AS XML, 
        @STR       AS VARCHAR(MAX), 
        @DELIMITER AS VARCHAR(10) 

SET @STR=(SELECT EMPLOYEE_NAME 
          FROM   EMPLOYEE) 
SET @DELIMITER =',' 
SET @XML = CAST(( '<EMPNAME>' 
                  + REPLACE(@STR, @DELIMITER, '</EMPNAME><EMPNAME>') 
                  + '</EMPNAME>' ) AS XML) 

SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE 
FROM   @XML.NODES('EMPNAME') AS T(N)

Následuje výstup:

Krok 3 :Vložte výstup generovaný dotazem provedeným výše do Employee_Detail stůl. Chcete-li to provést, spusťte následující kód:

USE DEMODATABASE
GO
DECLARE @XML AS XML,@STR AS VARCHAR(MAX),@DELIMITER AS VARCHAR(10)
SET @STR=(SELECT EMPLOYEE_NAME FROM EMPLOYEE)
SET @DELIMITER =','
SET @XML = CAST(('<EMPNAME>'+REPLACE(@STR,@DELIMITER ,'</EMPNAME><EMPNAME>')+'</EMPNAME>') AS XML)
INSERT INTO EMPLOYEE_DETAIL (EMPNAME)
SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE FROM @XML.NODES('EMPNAME') AS T(N)
/*Output
 (9 rows affected)
 */

Po vložení dat spusťte následující skript, abyste ověřili, že byla data vložena. Proveďte následující dotaz:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

Následuje výstup.

Metoda 3:Rozdělte řetězec pomocí funkce s hodnotou tabulky a vložte výstup funkce do tabulky

Tento přístup je tradiční a je podporován ve všech verzích a edicích SQL Server. V tomto přístupu vytvoříme uživatelem definovanou tabulkovou funkci, která bude používat smyčku while a funkce CHARINDEX a SUBSTRING.

Následuje kód pro vytvoření funkce:

REATE FUNCTION [DBO].SPLIT_DELIMITED_STRING (@SQLQUERY  VARCHAR(MAX), 
                                              @DELIMITOR CHAR(1)) 
RETURNS @RESULT TABLE( 
  VALUE VARCHAR(MAX)) 
AS 
  BEGIN 
      DECLARE @DELIMITORPOSITION INT = CHARINDEX(@DELIMITOR, @SQLQUERY), 
              @VALUE             VARCHAR(MAX), 
              @STARTPOSITION     INT = 1 

      IF @DELIMITORPOSITION = 0 
        BEGIN 
            INSERT INTO @RESULT 
            VALUES     (@SQLQUERY) 

            RETURN 
        END 

      SET @SQLQUERY = @SQLQUERY + @DELIMITOR 

      WHILE @DELIMITORPOSITION > 0 
        BEGIN 
            SET @VALUE = SUBSTRING(@SQLQUERY, @STARTPOSITION, 
                         @DELIMITORPOSITION - @STARTPOSITION) 

            IF( @VALUE <> '' ) 
              INSERT INTO @RESULT 
              VALUES     (@VALUE) 

            SET @STARTPOSITION = @DELIMITORPOSITION + 1 
            SET @DELIMITORPOSITION = CHARINDEX(@DELIMITOR, @SQLQUERY, 
                                     @STARTPOSITION) 
        END 

      RETURN 
  END

Jakmile je funkce vytvořena, spusťte následující dotaz pro rozdělení dotazu a vložení výstupu do Detail_zaměstnance tabulka.

DECLARE @SQLQUERY NVARCHAR(MAX) 
SET @SQLQUERY=(SELECT EMPLOYEE_NAME 
               FROM   EMPLOYEE) 
INSERT INTO EMPLOYEE_DETAIL 
SELECT * 
FROM   SPLIT_DELIMITED_STRING(@SQLQUERY, ',')

Jakmile jsou data vložena do tabulky, proveďte následující dotaz, abyste ověřili, že data byla vložena správně

Shrnutí

V tomto článku jsem se zabýval:

  1. Jiný přístup k rozdělení a vložení odděleného řetězce do tabulky.
  2. Vysoká úroveň je souhrn funkce STRING_SPLIT.
  3. Rozdělte a vložte oddělený řetězec pomocí XML a XQuery.
  4. Rozdělte a vložte řetězec s oddělovači pomocí uživatelsky definované funkce s hodnotou tabulky.

  1. Jak získat aktuální datum a čas v MySQL

  2. Aktualizovat časové razítko při aktualizaci řádku v PostgreSQL

  3. Proč nemohu provést agregační funkci na výrazu obsahujícím agregaci, ale mohu tak učinit vytvořením nového příkazu select kolem něj?

  4. Oracle:Kombinujte více výsledků v dílčím dotazu do jediné hodnoty oddělené čárkami