Podobně jako v mém článku týkajícím se příkazu SQL Server STUFF , dnes budeme zkoumat příkaz SQL serveru SUBSTRING. Pokud jde o parametry, které přijímá, je podobný příkazu STUFF.
Parametry akceptované SUBSTRING jsou následující:
SUBSTRING ( STRING_VALUE , STARTING_POSITION, LENGTH)
Příkaz SUBSTRING převládá ve většině hlavních standardních databází, jako je SQL Server, MySQL, Oracle a Postgres.
Pojďme prozkoumat funkci SUBSTRING na několika příkladech.
Část 1 – Jednoduché příklady SUBSTRING
V tomto prvním příkladu bude řetězcová hodnota „ABC“ předána funkci SUBSTRING. Každé volání bude mít argument počáteční pozice zvýšen o 1. Argument délky zůstane 1 pro každé volání.
SELECT SUBSTRING('ABC',1,1); --RETURNS : A
SELECT SUBSTRING('ABC',2,1); --RETURNS : B
SELECT SUBSTRING('ABC',3,1); --RETURNS : C
Z těchto příkladů můžeme vidět obecnou funkčnost funkce SUBSTRING, každý přírůstek na počáteční pozici posune vrácené písmeno. V provedení #1 je hodnota A, #2 je hodnota B a v provedení #3 je hodnota C.
Zajímavou funkcí funkce SUBSTRING je, že parametr length je nepřerušitelný, pokud překročí délku hodnoty, kterou analyzujete. Například hodnota „1000“ má délku 4 číslic. Pokud je analyzován pomocí následujícího dotazu specifikujícího délku 6, SUBSTRING vrátí původní řetězec.
SELECT SUBSTRING('1000',1,6); --RETURNS : 1000
Část 2 – Analýza dat pomocí funkce SUBSTRING
Pro další příklad předpokládejme, že máme databázi pro uchovávání dat o ojetých autech. Namísto použití vícetabulkového relačního datového modelu však databáze obsahuje pouze primární klíč a SKU nebo skladovou jednotku. Toto SKU lze použít k vyhledání více polí kolem funkcí automobilu pomocí následujícího klíče:
TOY-CEL-R-1990-150
-------------------------------------------------------
MAKE-MODEL-COLOR-YEAR-MILEAGE
*V těchto příkladech je ujeté kilometry reprezentováno v měřítku 1/1000, tj. 100 =100 000
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'CODESIGHT_DEMOS')
BEGIN
CREATE DATABASE CODESIGHT_DEMOS;
END;
GO
USE CODESIGHT_DEMOS;
IF OBJECT_ID('USEDCARS') IS NOT NULL DROP TABLE USEDCARS
CREATE TABLE USEDCARS
(
ID INT IDENTITY(1,1) PRIMARY KEY,
CAR_SKU VARCHAR(30)
)
--MAKE--MODEL--COLOR--YEAR--MILEAGE *1000
INSERT INTO USEDCARS
VALUES('TOY-CEL-R-1990-150')
INSERT INTO USEDCARS
VALUES('JEP-WRG-W-2019-15')
INSERT INTO USEDCARS
VALUES('FRD-ESC-G-1998-80')
SELECT * FROM USEDCARS
Výstup tabulky ojetých vozů je:
ID | CAR_SKU |
1 | TOY-CEL-R-1990-150 |
2 | JEP-WRG-W-2019-15 |
3 | FRD-ESC-G-1998-80 |
Pomocí funkce SUBSTRING lze tyto hodnoty analyzovat přiřazením správné počáteční polohy a parametrů délky do pole CAR_SKU.
SELECT SUBSTRING(CAR_SKU,1,3) AS MAKE,
SUBSTRING(CAR_SKU,5,3) AS MODEL,
SUBSTRING(CAR_SKU,9,1) AS COLOR,
SUBSTRING(CAR_SKU,11,4) AS YEAR,
SUBSTRING(CAR_SKU,16,3) * 1000 AS MILEAGE
FROM USEDCARS;
MAKE | MODEL | BARVA | ROK | NAJEDENÉ KILOMERY |
HRAČKA | CEL | R | 1990 | 150 000 |
JEP | WRG | W | 2019 | 15 000 |
FRD | ESC | G | 1998 | 80 000 |
Část 3 – Abstrakce logiky SQL SUBSTRING do pohledů
Pomocí funkce SQL SUBSTRING jsme byli schopni analyzovat různé vlastnosti každého vozidla v naší databázi. Udělejme tento krok dále a převeďte tento výstup na smysluplnější data vytvořením pohledu na dotaz SUBSTRING.
V relačním datovém modelu toho bude dosaženo použitím spojení k začlenění příkazu CASE WHEN k překladu hodnot.
CREATE VIEW VW_CAR_INVENTORY
AS
SELECT
CASE WHEN SUBSTRING(CAR_SKU,1,3) = 'TOY' THEN 'TOYOTA'
WHEN SUBSTRING(CAR_SKU,1,3) = 'JEP' THEN 'JEEP'
WHEN SUBSTRING(CAR_SKU,1,3) = 'FRD' THEN 'FORD'
END AS MAKE,
CASE WHEN SUBSTRING(CAR_SKU,5,3) = 'CEL' THEN 'CELICA'
WHEN SUBSTRING(CAR_SKU,5,3) = 'WRG' THEN 'WRANGLER'
WHEN SUBSTRING(CAR_SKU,5,3) = 'ESC' THEN 'ESCAPE'
END AS MODEL,
CASE WHEN SUBSTRING(CAR_SKU,9,1) = 'R' THEN 'RED'
WHEN SUBSTRING(CAR_SKU,9,1) = 'W' THEN 'WHITE'
WHEN SUBSTRING(CAR_SKU,9,1) = 'G' THEN 'GREEN'
END AS COLOR,
SUBSTRING(CAR_SKU,11,4) AS YEAR,
SUBSTRING(CAR_SKU,16,3) * 1000 AS MILEAGE
FROM USEDCARS
MAKE | MODEL | BARVA | ROK | NAJEDENÉ KILOMERY |
TOYOTA | CELICA | ČERVENÁ | 1990 | 150 000 |
JEEP | WRANGLER | BÍLÁ | 2019 | 15 000 |
FORD | ÚNIK | ZELENÁ | 1998 | 80 000 |
Část 4 – SUBSTRING A alternativy pro celočíselné hodnoty
Funkce SUBSTRING je explicitně určena pro řetězcové hodnoty, takže následující dotaz, který se pokouší analyzovat celočíselnou hodnotu pomocí SUBSTRING, selže.
SELECT SUBSTRING(1000,1,1);
--Msg 8116, Level 16, State 1, Line 78 Argument data type int is invalid for argument 1 of substring function.
Alternativou při analýze celočíselných hodnot je funkce LEFT nebo RIGHT, ačkoli tento přístup ztrácí určitou flexibilitu nabízenou funkcí SUBSTRING.
SELECT LEFT(10000,1); --RETURNS : 1
SELECT RIGHT(1000,1) ; --RETURNS : 0
Případně můžete také explicitně přetypovat celočíselnou hodnotu jako řetězec a podřetězec přetypované hodnoty:
SELECT (SUBSTRING(CAST(1000 AS VARCHAR(4)),1,1)) AS CASTED_SUBSTRING -- RETURNS : 1
Přehled
Tento článek se zabývá parametry požadovanými k použití funkce SUBSTRING, což je silný argument pro počáteční pozici a délku. S nerelačním datovým modelem jsme pomocí metody SUBSTRING extrahovali vlastnosti vozu z tabulky 1 pole a vytvořili pohled s integrovanou transformační logikou.
Metoda SUBSTRING je skvělá funkce, kterou je třeba znát při provádění ETL nebo analýze dat v databázi. Lze jej použít k extrahování smysluplných klíčových datových bodů z již existujících dat ve vaší databázi.