sql >> Database >  >> RDS >> Sqlserver

SUBSTRING Commando in SQL:A Primer

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.


  1. SSIS - de waarde kan niet worden geconverteerd vanwege mogelijk gegevensverlies

  2. Maximale lengte voor tekst van het MySQL-type

  3. 2 manieren om alle tabelwaardige functies in een SQL Server-database op te sommen

  4. Tabelvariabele maken in MySQL