Podobny do mojego artykułu dotyczącego polecenia SQL Server STUFF , dzisiaj będziemy badać polecenie serwera SQL SUBSTRING. Jest podobny do polecenia STUFF pod względem akceptowanych parametrów.
Parametry akceptowane przez SUBSTRING są następujące:
SUBSTRING ( STRING_VALUE , STARTING_POSITION, LENGTH)
Polecenie SUBSTRING jest powszechne w większości głównych standardowych baz danych, takich jak SQL Server, MySQL, Oracle i Postgres.
Przyjrzyjmy się funkcji SUBSTRING na kilku przykładach.
Sekcja 1 – Proste przykłady PODŁAŃCÓW
W tym pierwszym przykładzie do funkcji SUBSTRING zostanie przekazana wartość ciągu „ABC”. Każde wywołanie będzie miało argument pozycji początkowej zwiększony o 1. Argument długości pozostanie 1 dla każdego wywołania.
SELECT SUBSTRING('ABC',1,1); --RETURNS : A
SELECT SUBSTRING('ABC',2,1); --RETURNS : B
SELECT SUBSTRING('ABC',3,1); --RETURNS : C
Z tych przykładów możemy zobaczyć ogólną funkcjonalność funkcji PODŁAŃCUCH, każdy przyrost w pozycji początkowej przesuwa zwracaną literę. W wykonaniu #1 wartością jest A, #2 wartością jest B, a w #3 wartością jest C.
Interesującą cechą funkcji SUBSTRING jest to, że parametr length jest nieprzerywalny, jeśli przekracza długość analizowanej wartości. Na przykład wartość „1000” ma długość 4 cyfr. W przypadku analizy z następującym zapytaniem określającym długość 6, SUBSTRING zwraca oryginalny ciąg.
SELECT SUBSTRING('1000',1,6); --RETURNS : 1000
Sekcja 2 – Parsowanie danych za pomocą funkcji SUBSTRING
W kolejnym przykładzie załóżmy, że mamy bazę danych do przechowywania danych o używanych samochodach. Jednak zamiast korzystać z wielotabelowego relacyjnego modelu danych, baza danych zawiera tylko klucz podstawowy i jednostkę SKU lub jednostkę magazynową. Ten kod SKU można wykorzystać do znalezienia wielu pól wokół cech samochodu za pomocą następującego klawisza:
TOY-CEL-R-1990-150
-------------------------------------------------------
MAKE-MODEL-COLOR-YEAR-MILEAGE
*W tych przykładach przebieg jest przedstawiony w skali 1/1000, tj. 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
Dane wyjściowe tabeli używanych samochodów to:
ID | CAR_SKU |
1 | TOY-CEL-R-1990-150 |
2 | JEP-WRG-W-2019-15 |
3 | FRD-ESC-G-1998-80 |
Korzystając z funkcji SUBSTRING, wartości te można analizować, przypisując prawidłową pozycję początkową i parametry długości do pola 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;
WYKONAJ | WZÓR | KOLOR | ROK | PRZEBIEG |
ZABAWKA | CEL | R | 1990 | 150000 |
JEP | WRG | W | 2019 | 15000 |
FRD | ESC | G | 1998 | 80000 |
Sekcja 3 – Abstrahowanie logiki SQL SUBSTRING do widoków
Korzystając z funkcji SQL SUBSTRING, byliśmy w stanie przeanalizować różne cechy każdego pojazdu w naszej bazie danych. Pójdźmy o krok dalej i przetłumaczmy te dane wyjściowe na bardziej znaczące dane, tworząc widok zapytania SUBSTRING.
W relacyjnym modelu danych zostanie to osiągnięte przez użycie złączeń w celu włączenia instrukcji CASE WHEN do przetłumaczenia wartości.
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
WYKONAJ | WZÓR | KOLOR | ROK | PRZEBIEG |
TOYOTA | CELICA | CZERWONY | 1990 | 150000 |
JEEP | WRANGLER | BIAŁY | 2019 | 15000 |
FORD | UCIECZKA | ZIELONY | 1998 | 80000 |
Sekcja 4 – PODŁAŃCUCH A Alternatywy dla wartości całkowitych
Funkcja PODŁAŃCUCH jest jawnie dla wartości łańcuchowych, więc następujące zapytanie próbujące przeanalizować wartość całkowitą za pomocą PODŁAŃCUCHU zakończy się niepowodzeniem.
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.
Alternatywą podczas analizowania wartości całkowitych jest funkcja LEFT lub RIGHT, chociaż to podejście traci część elastyczności prezentowanej w funkcji SUBSTRING.
SELECT LEFT(10000,1); --RETURNS : 1
SELECT RIGHT(1000,1) ; --RETURNS : 0
Sytuacyjnie możesz również jawnie rzutować wartość całkowitą jako łańcuch i podłańcuch rzutowanej wartości:
SELECT (SUBSTRING(CAST(1000 AS VARCHAR(4)),1,1)) AS CASTED_SUBSTRING -- RETURNS : 1
Podsumowanie
W tym artykule omówiono parametry wymagane do użycia funkcji PODŁAŃCUCH, która jest silnym argumentem za pozycją początkową i długością. W przypadku nierelacyjnego modelu danych użyliśmy metody SUBSTRING, aby wyodrębnić cechy samochodu z tabeli jednopolowej i skonstruować widok z wbudowaną logiką transformacji.
Metoda SUBSTRING jest świetną funkcją do poznania podczas wykonywania ETL lub analizowania danych w bazie danych. Można go użyć do wyodrębnienia znaczących kluczowych punktów danych z już istniejących danych w bazie danych.