Svarende til min artikel om SQL Server STUFF-kommandoen , i dag vil vi undersøge SUBSTRING SQL-serverkommandoen. Den ligner STUFF-kommandoen med hensyn til de parametre, den accepterer.
De parametre, der accepteres af SUBSTRING, er som følger:
SUBSTRING ( STRING_VALUE , STARTING_POSITION, LENGTH)
SUBSTRING-kommandoen er udbredt i de fleste større standarddatabaser som SQL Server, MySQL, Oracle og Postgres.
Lad os udforske SUBSTRING-funktionen med flere eksempler.
Afsnit 1 – Simple SUBSTRING-eksempler
I dette første eksempel vil en strengværdi på "ABC" blive sendt til SUBSTRING-funktionen. Hvert kald vil have startpositionsargumentet forøget med 1. Længdeargumentet forbliver 1 for hvert kald.
SELECT SUBSTRING('ABC',1,1); --RETURNS : A
SELECT SUBSTRING('ABC',2,1); --RETURNS : B
SELECT SUBSTRING('ABC',3,1); --RETURNS : C
Fra disse eksempler kan vi se den generelle funktionalitet af SUBSTRING-funktionen, hver stigning i startpositionen flytter det returnerede bogstav. I udførelse #1 er værdien A, #2 er værdien B og i #3 er værdien C.
Et interessant træk ved SUBSTRING-funktionen er, at længdeparameteren er ikke-brud, hvis den overskrider længden af den værdi, du parser. For eksempel har værdien "1000" en længde på 4 cifre. Hvis den parses med følgende forespørgsel, der angiver en længde på 6, returnerer SUBSTRING den oprindelige streng.
SELECT SUBSTRING('1000',1,6); --RETURNS : 1000
Afsnit 2 – Parsing af data med SUBSTRING-funktionen
For det næste eksempel, lad os antage, at vi har en database til at opbevare data om brugte biler. Men i stedet for at bruge en multi-table relationel datamodel, indeholder databasen kun en primær nøgle og en SKU eller lagerenhed. Denne SKU kan bruges til at finde flere felter omkring funktionerne i en bil ved at bruge følgende nøgle:
TOY-CEL-R-1990-150
-------------------------------------------------------
MAKE-MODEL-COLOR-YEAR-MILEAGE
*I disse eksempler er kilometertal repræsenteret på en skala på 1/1000, dvs. 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
Outputtet fra brugtbilstabellen er:
ID | CAR_SKU |
1 | TOY-CEL-R-1990-150 |
2 | JEP-WRG-W-2019-15 |
3 | FRD-ESC-G-1998-80 |
Ved at bruge SUBSTRING-funktionen kan disse værdier parses ved at tildele den korrekte startposition og længdeparametre til CAR_SKU-feltet.
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 | FARVE | ÅR | MILEAGE |
LEGETØJ | CEL | R | 1990 | 150.000 |
JEP | WRG | W | 2019 | 15.000 |
FRD | ESC | G | 1998 | 80.000 |
Afsnit 3 – Abstraktion af SUBSTRING SQL-logikken til visninger
Ved at bruge SQL SUBSTRING-funktionen var vi i stand til at analysere de forskellige funktioner i hvert køretøj i vores database. Lad os tage dette 1 skridt længere og omsætte dette output til mere meningsfulde data ved at opbygge en visning på SUBSTRING-forespørgslen.
I en relationel datamodel vil dette blive opnået ved at bruge joins til at inkorporere CASE WHEN-sætningen for at oversætte værdierne.
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 | FARVE | ÅR | MILEAGE |
TOYOTA | CELICA | RØD | 1990 | 150.000 |
JEEP | WRANGLER | HVID | 2019 | 15.000 |
FORD | ESCAPE | GRØN | 1998 | 80.000 |
Afsnit 4 – SUBSTRING A alternativer til heltalsværdier
SUBSTRING-funktionen er eksplicit for strengværdier, så den følgende forespørgsel, der forsøger at parse en heltalsværdi med SUBSTRING, vil mislykkes.
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.
Alternativet, når man analyserer heltalsværdier, er funktionen VENSTRE eller HØJRE, selvom denne tilgang mister noget af fleksibiliteten, der præsenteres med SUBSTRING-funktionen.
SELECT LEFT(10000,1); --RETURNS : 1
SELECT RIGHT(1000,1) ; --RETURNS : 0
Situationsmæssigt kan du også eksplicit caste heltalsværdien som en streng og understreng den castede værdi:
SELECT (SUBSTRING(CAST(1000 AS VARCHAR(4)),1,1)) AS CASTED_SUBSTRING -- RETURNS : 1
Oversigt
Denne artikel dækkede de parametre, der kræves for at bruge SUBSTRING-funktionen, som er et stærkt argument for en startposition og en længde. Med en ikke-relationsdatamodel brugte vi SUBSTRING-metoden til at udtrække bilegenskaberne fra en 1-feltstabel og konstruere en visning med en indbygget transformationslogik.
SUBSTRING-metoden er en fantastisk funktion at kende, når du udfører ETL eller parser data inde i en database. Det kan bruges til at udtrække meningsfulde nøgledatapunkter fra de allerede eksisterende data inde i din database.