Sdílet prostřednictvím


PODřetěžce (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vrátí část znaku, binárního, textového nebo obrázkového výrazu v SQL Serveru.

Transact-SQL konvence syntaxe

Syntaxe

Syntaxe pro SQL Server

SUBSTRING ( expression , start [ , length ] )

Argumenty

výrazu

Znak, binární,text, ntext nebo výraz obrázku.

spuštění

Celé číslo nebo výraz bigint , který určuje, kde vrácené znaky začínají. (Číslování je založené na 1, což znamená, že první znak ve výrazu je 1). Pokud je začátek menší než 1, vrácený výraz začíná prvním znakem zadaným ve výrazu. V tomto případě je počet vrácených znaků největší hodnotou součtu počáteční + délky – 1 nebo 0. Pokud je začátek větší než počet znaků ve výrazu hodnoty, vrátí se výraz nulové délky.

délka

Kladné celé číslo nebo výraz bigint , který určuje, kolik znaků výrazu se vrátí. Pokud je délka záporná, vygeneruje se chyba a příkaz se ukončí. Pokud je součet začátku a délky větší než počet znaků ve výrazu, vrátí se celý výraz hodnoty začínající na začátku . Pokud je délka vynechána, vrátí se všechny znaky od počáteční pozice do konce výrazu.

Podřetězec můžete použít s volitelným argumentem délky . Pokud však použijete NULLdélku, SUBSTRING vrátí hodnotu NULL. Zkontrolujte E. Použijte substring s volitelným argumentem délky pro příklad.

Návratové typy

Vrátí data znaků, pokud je výraz jedním z podporovaných datových typů znaků. Vrátí binární data, pokud je výraz jedním z podporovaných binárních datových typů. Vrácený řetězec je stejný typ jako zadaný výraz s výjimkami zobrazenými v tabulce.

Zadaný výraz Návratový typ
uklízečka / varchar / Text Varchar
NCHAR / nvarchar / ntext nvarchar
binární / varbinary / obraz varbinary

Poznámky

Hodnoty pro začátek a délku musí být zadány v počtu znaků pro datové typy ntext, char nebo varchar a bajty pro text, obrázek, binární nebo varbinární datové typy.

Výraz musí být varchar(max) nebo varbinary(max), pokud začátek nebo délka obsahuje hodnotu větší než 2 147 483 647.

Doplňkové znaky (náhradní dvojice)

Pokud použijete kolace doplňkových znaků (SC), počítá se každá náhradní dvojice ve výrazu jako jeden znak počáteční i délka. Další informace najdete v tématu podpora kolace a kódování Unicode.

Příklady

A. Použití podřetězce s řetězcem znaků

Následující příklad ukazuje, jak vrátit pouze část znakového řetězce. sys.databases Z tabulky tento dotaz vrátí názvy systémových databází v prvním sloupci, první písmeno databáze ve druhém sloupci a třetí a čtvrtý znak v posledním sloupci.

SELECT name,
       SUBSTRING(name, 1, 1) AS Initial,
       SUBSTRING(name, 3, 2) AS ThirdAndFourthCharacters
FROM sys.databases
WHERE database_id < 5;

Tady je soubor výsledků.

název Počáteční TřetíaČtvrtéZnaky
master m st
tempdb t mp
model m de
msdb m db

K zobrazení druhého, třetího a čtvrtého znaku řetězcové konstanty abcdefpoužijte následující dotaz.

SELECT SUBSTRING('abcdef', 2, 3) AS x;

Tady je soubor výsledků.

x
----------
bcd

B. Použití podřetězce s textem, ntextem a daty obrázků

Poznámka:

Pokud chcete spustit následující příklady, musíte nainstalovat databázi pubs.

Následující příklad ukazuje, jak vrátit prvních 10 znaků z každého sloupce textových a obrázkových dat v pub_info tabulce pubs databáze. textová data se vrátí jako varchar a obrazová data se vrátí jako varbinary.

USE pubs;
GO

SELECT pub_id,
       SUBSTRING(logo, 1, 10) AS logo,
       SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756';

Tady je soubor výsledků.

 pub_id logo    pr_info
------ ---------------------- ----------
1756   0x474946383961E3002500 This is sa

Následující příklad ukazuje účinek SUBSTRING na textová i ntextová data. Nejprve tento příklad vytvoří novou tabulku v pubs databázi s názvem npub_info. Druhý příklad vytvoří pr_info sloupec v npub_info tabulce z prvních 80 znaků pub_info.pr_info sloupce a přidá jako ü první znak. Nakonec načte INNER JOIN všechna identifikační čísla vydavatele a SUBSTRINGtextové i ntextové sloupce s informacemi o vydavateli.

IF EXISTS (SELECT table_name
           FROM INFORMATION_SCHEMA.TABLES
           WHERE table_name = 'npub_info')
    DROP TABLE npub_info;
GO

-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs;
GO

CREATE TABLE npub_info
(
    pub_id CHAR (4) NOT NULL FOREIGN KEY
        REFERENCES publishers (pub_id)
        CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
    pr_info NTEXT NULL
);
GO

-- Fill the pr_info column in npub_info with international data.
RAISERROR ('Now at the inserts to pub_info...', 0, 1);
GO

INSERT npub_info
VALUES ('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database'),
    ('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa'),
    ('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da'),
    ('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database'),
    ('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d'),
    ('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab'),
    ('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i'),
    ('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data');
GO

-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id,
       SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
       SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info AS pr
     INNER JOIN npub_info AS npr
         ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC;

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

C. Použití podřetězce s řetězcem znaků

Následující příklad ukazuje, jak vrátit pouze část znakového řetězce. dbo.DimEmployee Z tabulky tento dotaz vrátí název rodiny v jednom sloupci s pouze prvním iniciály ve druhém sloupci.

-- Uses AdventureWorks
SELECT LastName,
       SUBSTRING(FirstName, 1, 1) AS Initial
FROM dbo.DimEmployee
WHERE LastName LIKE 'Bar%'
ORDER BY LastName;

Tady je soubor výsledků.

LastName             Initial
-------------------- -------
Barbariol            A
Barber               D
Barreto de Mattos    P

Následující příklad ukazuje, jak vrátit druhý, třetí a čtvrtý znak řetězcové konstanty abcdef.

USE ssawPDW;

SELECT TOP 1 SUBSTRING('abcdef', 2, 3) AS x
FROM dbo.DimCustomer;

Tady je soubor výsledků.

x
-----
bcd

D. Použití řetězce SUBSTRING s argumentem NULL délky

SELECT SUBSTRING('123abc', 4, NULL) AS [NULL length];

Tady je soubor výsledků.

NULL length
-----------
NULL

E. Použití řetězce SUBSTRING s volitelným argumentem délky

Platí pro: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, PdW (Analytics Platform System) a Warehouse a koncový bod analýzy SQL v Microsoft Fabric

Následující příklad ukazuje, jak vrátit pouze část znakového řetězce z dané počáteční pozice. Vzhledem k tomu, že argument délky není zadaný, vrátí výchozí délka zbývající znaky v řetězci.

SELECT SUBSTRING('123abc', 4) AS y;

Tady je soubor výsledků.

y
-----
abc

F. Použití substrING bez argumentu délky k vyhledání náhradních dílů v inventáři AdventureWorks2022

USE AdventureWorks2022;
GO

SELECT [ProductDescriptionID],
       [Description],
       SUBSTRING([Description], LEN('Replacement') + 1) AS [Replacement-Part]
FROM [Production].[ProductDescription]
WHERE [Description] LIKE 'Replacement%';

Tady je soubor výsledků.

ID popisu produktu Popis Replacement-Part
686 Náhradní horské kolo pro jezdce na úrovni vstupu. horské kolo pro jezdce na úrovni vstupu.
687 Náhradní horské kolo pro ležérní na vážného jezdce. horské kolo pro ležérní pro vážného jezdce.
689 Náhradní silniční přední kolo pro cyklistu na úrovni vstupu. silniční přední kolo pro cyklistu na úrovni vstupu.
867 Náhradní zadní horské kolo pro jezdce na úrovni vstupu. zadní horské kolo pro jezdce na úrovni vstupu.
868 Náhradní zadní horské kolo pro ležérní na vážného jezdce. zadní horské kolo pro ležérní na vážné jezdce.
870 Náhradní zadní kolo pro cyklisty na úrovni vstupu. zadní kolo pro cyklistu na úrovni vstupu.
1981 Náhradní horské kolo pro jezdce na úrovni vstupu. horské kolo pro jezdce na úrovni vstupu.
1987 Náhradní horské kolo pro ležérní na vážného jezdce. horské kolo pro ležérní pro vážného jezdce.
1999 Náhradní zadní kolo pro cyklistu na úrovni vstupu. silniční zadní kolo pro cyklistu na úrovni vstupu.