Подобно на моята статия относно командата STUFF на SQL Server , днес ще разгледаме командата SUBSTRING SQL сървър. Тя е подобна на командата STUFF по отношение на параметрите, които приема.
Параметрите, приети от SUBSTRING, са както следва:
SUBSTRING ( STRING_VALUE , STARTING_POSITION, LENGTH)
Командата SUBSTRING е разпространена в повечето основни стандартни бази данни като SQL Server, MySQL, Oracle и Postgres.
Нека разгледаме функцията SUBSTRING с няколко примера.
Раздел 1 – Прости примери за SUBSTRING
В този първи пример стойност на низ от „ABC“ ще бъде предадена на функцията SUBSTRING. Всяко извикване ще има аргумент за начална позиция, увеличен с 1. Аргументът за дължина ще остане 1 за всяко повикване.
SELECT SUBSTRING('ABC',1,1); --RETURNS : A
SELECT SUBSTRING('ABC',2,1); --RETURNS : B
SELECT SUBSTRING('ABC',3,1); --RETURNS : C
От тези примери можем да видим общата функционалност на функцията SUBSTRING, всяко увеличение в началната позиция измества върнатата буква. При изпълнение #1 стойността е A, #2 стойността е B и в #3 стойността е C.
Интересна характеристика на функцията SUBSTRING е, че параметърът за дължина не е прекъсващ, ако надвишава дължината на стойността, която анализирате. Например стойността „1000“ има дължина от 4 цифри. Ако се анализира със следната заявка, указваща дължина от 6, SUBSTRING връща оригиналния низ.
SELECT SUBSTRING('1000',1,6); --RETURNS : 1000
Раздел 2 – Синтактичен анализ на данни с функцията SUBSTRING
За следващия пример нека приемем, че имаме база данни за съхраняване на данни за употребявани автомобили. Въпреки това, вместо да използва модел на релационни данни с множество таблици, базата данни съдържа първичен ключ и SKU или само единица за съхранение. Този SKU може да се използва за намиране на множество полета около характеристиките на автомобил, като се използва следния ключ:
TOY-CEL-R-1990-150
-------------------------------------------------------
MAKE-MODEL-COLOR-YEAR-MILEAGE
*В тези примери пробегът е представен в мащаб от 1/1000, т.е. 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
Резултатът от таблицата за използвани автомобили е:
ID | CAR_SKU |
1 | TOY-CEL-R-1990-150 |
2 | JEP-WRG-W-2019-15 |
3 | FRD-ESC-G-1998-80 |
Използвайки функцията SUBSTRING, тези стойности могат да бъдат анализирани чрез присвояване на правилните параметри за начална позиция и дължина на полето 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;
НАПРАВЕТЕ | МОДЕЛ | ЦВЯТ | ГОДИНА | ПРОМИЛЕЖИ |
ИГРАЧКА | CEL | R | 1990 | 150 000 |
JEP | WRG | W | 2019 | 15 000 |
FRD | ESC | G | 1998 | 80 000 |
Раздел 3 – Абстрагиране на SUBSTRING SQL логиката към изгледи
Използвайки функцията SQL SUBSTRING, успяхме да анализираме различните характеристики на всяко превозно средство в нашата база данни. Нека направим тази 1 стъпка по-далеч и да преведем този изход в по-смислени данни, като изградим изглед върху заявката SUBSTRING.
В релационен модел на данни това ще бъде постигнато чрез използване на съединения за включване на оператора CASE WHEN за превод на стойностите.
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
НАПРАВЕТЕ | МОДЕЛ | ЦВЯТ | ГОДИНА | ПРОМИЛЕЖИ |
TOYOTA | CELICA | ЧЕРВЕНО | 1990 | 150 000 |
ДЖИП | WRANGLER | БЯЛ | 2019 | 15000 |
FORD | БЯГВАНЕ | ЗЕЛЕНО | 1998 | 80 000 |
Раздел 4 – SUBSTRING A Алтернативи за целочислени стойности
Функцията SUBSTRING е изрично за низови стойности, така че следната заявка, която се опитва да анализира целочислена стойност с SUBSTRING, ще се провали.
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.
Алтернативата при анализиране на целочислени стойности е функцията НАЛЯВО или ДЯСНО, въпреки че този подход губи част от гъвкавостта, предоставена с функцията SUBSTRING.
SELECT LEFT(10000,1); --RETURNS : 1
SELECT RIGHT(1000,1) ; --RETURNS : 0
Ситуално можете също така изрично да прехвърлите целочислената стойност като низ и да поднизвате прехвърлената стойност:
SELECT (SUBSTRING(CAST(1000 AS VARCHAR(4)),1,1)) AS CASTED_SUBSTRING -- RETURNS : 1
Резюме
Тази статия обхваща параметрите, необходими за използване на функцията SUBSTRING, която е силен аргумент за начална позиция и дължина. С нерелационен модел на данни използвахме метода SUBSTRING, за да извлечем характеристиките на автомобила от таблица с 1 поле и да изградим изглед с вградена в него логика на трансформация.
Методът SUBSTRING е чудесна функция, която трябва да знаете, когато изпълнявате ETL или анализирате данните в база данни. Може да се използва за извличане на значими ключови данни от вече съществуващите данни във вашата база данни.