sql >> Databasteknik >  >> RDS >> Sqlserver

SUBSTRING Kommando i SQL:A Primer

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.


  1. Ändra MySQL standardteckenuppsättning till UTF-8 i my.cnf?

  2. datetime2 vs datetimeoffset i SQL Server:Vad är skillnaden?

  3. Avancerad failover med Post/pre Script Hooks

  4. Varför har vissa kommandon ingen effekt i psql?