Liknar min artikel om kommandot SQL Server STUFF , idag kommer vi att undersöka SUBSTRING SQL-serverkommandot. Det liknar STUFF-kommandot när det gäller de parametrar som det accepterar.
Parametrarna som accepteras av SUBSTRING är följande:
SUBSTRING ( STRING_VALUE , STARTING_POSITION, LENGTH)
Kommandot SUBSTRING är vanligt i de flesta större standarddatabaser som SQL Server, MySQL, Oracle och Postgres.
Låt oss utforska SUBSTRING-funktionen med flera exempel.
Avsnitt 1 – Enkla SUBSTRING-exempel
I det här första exemplet kommer ett strängvärde på "ABC" att skickas till SUBSTRING-funktionen. Varje anrop kommer att ha startpositionsargumentet ökat med 1. Längdargumentet förblir 1 för varje anrop.
SELECT SUBSTRING('ABC',1,1); --RETURNS : A
SELECT SUBSTRING('ABC',2,1); --RETURNS : B
SELECT SUBSTRING('ABC',3,1); --RETURNS : C
Från dessa exempel kan vi se den allmänna funktionen för SUBSTRING-funktionen, varje steg i startpositionen förskjuter bokstaven som returneras. I körning #1 är värdet A, #2 är värdet B och i #3 är värdet C.
En intressant egenskap hos SUBSTRING-funktionen är att längdparametern inte bryter om den överskrider längden på värdet du analyserar. Till exempel har värdet "1000" en längd på fyra siffror. Om den analyseras med följande fråga som anger en längd på 6, returnerar SUBSTRING den ursprungliga strängen.
SELECT SUBSTRING('1000',1,6); --RETURNS : 1000
Avsnitt 2 – Analysera data med SUBSTRING-funktionen
För nästa exempel, låt oss anta att vi har en databas för att lagra data om begagnade bilar. Men istället för att använda en relationsdatamodell med flera tabeller innehåller databasen endast en primärnyckel och en SKU eller lagerhållningsenhet. Denna SKU kan användas för att hitta flera fält kring funktionerna i en bil genom att använda följande nyckel:
TOY-CEL-R-1990-150
-------------------------------------------------------
MAKE-MODEL-COLOR-YEAR-MILEAGE
*I dessa exempel representeras körsträcka på en skala av 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
Utdata från tabellen för begagnade bilar är:
ID | CAR_SKU |
1 | TOY-CEL-R-1990-150 |
2 | JEP-WRG-W-2019-15 |
3 | FRD-ESC-G-1998-80 |
Med hjälp av SUBSTRING-funktionen kan dessa värden analyseras genom att tilldela korrekt startposition och längdparametrar till fältet 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 | FÄRG | ÅR | MILEAGE |
LEKAK | CEL | R | 1990 | 150 000 |
JEP | WRG | W | 2019 | 15 000 |
FRD | ESC | G | 1998 | 80 000 |
Avsnitt 3 – Abstrahera SUBSTRING SQL-logiken till vyer
Med hjälp av SQL SUBSTRING-funktionen kunde vi analysera de olika funktionerna för varje fordon i vår databas. Låt oss ta detta ett steg längre och översätta den utdata till mer meningsfull data genom att bygga en vy på SUBSTRING-frågan.
I en relationsdatamodell kommer detta att uppnås genom att använda joins för att införliva CASE WHEN-satsen för att översätta värdena.
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 | FÄRG | ÅR | MILEAGE |
TOYOTA | CELICA | RÖD | 1990 | 150 000 |
JEEP | WRANGLER | VIT | 2019 | 15 000 |
FORD | FLYM | GRÖN | 1998 | 80 000 |
Avsnitt 4 – SUBSTRING A alternativ för heltalsvärden
SUBSTRING-funktionen är explicit för strängvärden, så följande fråga som försöker analysera ett heltalsvärde med SUBSTRING kommer att misslyckas.
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 vid analys av heltalsvärden är funktionen VÄNSTER eller HÖGER, även om detta tillvägagångssätt förlorar en del av den flexibilitet som presenteras med SUBSTRING-funktionen.
SELECT LEFT(10000,1); --RETURNS : 1
SELECT RIGHT(1000,1) ; --RETURNS : 0
Situationellt kan du också uttryckligen casta heltalsvärdet som en sträng och understräng det castade värdet:
SELECT (SUBSTRING(CAST(1000 AS VARCHAR(4)),1,1)) AS CASTED_SUBSTRING -- RETURNS : 1
Sammanfattning
Den här artikeln behandlade parametrarna som krävs för att använda SUBSTRING-funktionen som är ett starkt argument för en startposition och en längd. Med en icke-relationsdatamodell använde vi SUBSTRING-metoden för att extrahera bilegenskaperna från en 1-fältstabell och konstruera en vy med någon transformationslogik inbyggd i den.
SUBSTRING-metoden är en utmärkt funktion att veta när man utför ETL eller analyserar data inuti en databas. Den kan användas för att extrahera meningsfulla nyckeldatapunkter från redan befintliga data inuti din databas.