Gelijkaardig aan mijn artikel over het SQL Server STUFF-commando , zullen we vandaag de opdracht SUBSTRING SQL-server onderzoeken. Het is vergelijkbaar met het STUFF-commando wat betreft de parameters die het accepteert.
De parameters die door SUBSTRING worden geaccepteerd zijn als volgt:
SUBSTRING ( STRING_VALUE , STARTING_POSITION, LENGTH)
De opdracht SUBSTRING komt veel voor in de meeste grote standaarddatabases zoals SQL Server, MySQL, Oracle en Postgres.
Laten we de SUBSTRING-functie eens onderzoeken met verschillende voorbeelden.
Sectie 1 – Eenvoudige SUBSTRING-voorbeelden
In dit eerste voorbeeld wordt de tekenreekswaarde "ABC" doorgegeven aan de functie SUBSTRING. Bij elke aanroep wordt het startpositieargument met 1 verhoogd. Het lengteargument blijft 1 voor elke aanroep.
SELECT SUBSTRING('ABC',1,1); --RETURNS : A
SELECT SUBSTRING('ABC',2,1); --RETURNS : B
SELECT SUBSTRING('ABC',3,1); --RETURNS : C
Uit deze voorbeelden kunnen we de algemene functionaliteit van de SUBSTRING-functie zien, elke verhoging in de startpositie verschuift de geretourneerde letter. In uitvoering #1 is de waarde A, #2 is de waarde B en in #3 is de waarde C.
Een interessant kenmerk van de SUBSTRING-functie is dat de lengteparameter niet-afbrekend is als deze de lengte overschrijdt van de waarde die u aan het ontleden bent. De waarde "1000" heeft bijvoorbeeld een lengte van 4 cijfers. Indien geparseerd met de volgende query die een lengte van 6 specificeert, geeft SUBSTRING de originele string terug.
SELECT SUBSTRING('1000',1,6); --RETURNS : 1000
Sectie 2 – Gegevens ontleden met de SUBSTRING-functie
Laten we voor het volgende voorbeeld aannemen dat we een database hebben om gegevens over gebruikte auto's bij te houden. In plaats van een relationeel gegevensmodel met meerdere tabellen te gebruiken, bevat de database echter alleen een primaire sleutel en een SKU of voorraadeenheid. Deze SKU kan worden gebruikt om meerdere velden rond de kenmerken van een auto te vinden door de volgende sleutel te gebruiken:
TOY-CEL-R-1990-150
-------------------------------------------------------
MAKE-MODEL-COLOR-YEAR-MILEAGE
*In deze voorbeelden wordt de kilometerstand weergegeven op een schaal van 1/1000, d.w.z. 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
De output van de gebruikte autotabel is:
ID | CAR_SKU |
1 | TOY-CEL-R-1990-150 |
2 | JEP-WRG-W-2019-15 |
3 | FRD-ESC-G-1998-80 |
Met behulp van de SUBSTRING-functie kunnen deze waarden worden geparseerd door de juiste startpositie- en lengteparameters toe te wijzen aan het CAR_SKU-veld.
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;
MAAK | MODEL | KLEUR | JAAR | MILEAGE |
SPEELGOED | CEL | R | 1990 | 150000 |
JEP | WRG | W | 2019 | 15000 |
FRD | ESC | G | 1998 | 80000 |
Sectie 3 – De SUBSTRING SQL-logica abstraheren naar views
Met behulp van de SQL SUBSTRING-functie konden we de verschillende kenmerken van elk voertuig in onze database analyseren. Laten we nog een stap verder gaan en die output vertalen naar zinvollere gegevens door een weergave op de SUBSTRING-query te bouwen.
In een relationeel gegevensmodel wordt dit bereikt door joins te gebruiken om de CASE WHEN-instructie op te nemen om de waarden te vertalen.
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
MAAK | MODEL | KLEUR | JAAR | MILEAGE |
TOYOTA | CELICA | ROOD | 1990 | 150000 |
JEEP | WRANGLER | WIT | 2019 | 15000 |
FORD | ONTSNAPPEN | GROEN | 1998 | 80000 |
Sectie 4 – SUBSTRING A Alternatieven voor gehele getallen
De functie SUBSTRING is expliciet voor tekenreekswaarden, dus de volgende query die probeert een geheel getal te ontleden met SUBSTRING, zal mislukken.
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.
Het alternatief bij het ontleden van gehele getallen is de LEFT- of RIGHT-functie, hoewel deze benadering een deel van de flexibiliteit verliest die wordt geboden door de SUBSTRING-functie.
SELECT LEFT(10000,1); --RETURNS : 1
SELECT RIGHT(1000,1) ; --RETURNS : 0
Situationeel zou je de integerwaarde ook expliciet als een string kunnen casten en de casted value substring:
SELECT (SUBSTRING(CAST(1000 AS VARCHAR(4)),1,1)) AS CASTED_SUBSTRING -- RETURNS : 1
Samenvatting
Dit artikel behandelt de parameters die nodig zijn om de SUBSTRING-functie te gebruiken, wat een sterk argument is voor een startpositie en een lengte. Met een niet-relatiegegevensmodel hebben we de SUBSTRING-methode gebruikt om de autokenmerken uit een 1-veldtabel te extraheren en een weergave te construeren waarin enige transformatielogica is ingebouwd.
De SUBSTRING-methode is een geweldige functie om te weten bij het uitvoeren van ETL of het ontleden van de gegevens in een database. Het kan worden gebruikt om betekenisvolle belangrijke gegevenspunten te extraheren uit de reeds bestaande gegevens in uw database.