Semelhante ao meu artigo sobre o comando SQL Server STUFF , hoje estaremos examinando o comando do servidor SQL SUBSTRING. É semelhante ao comando STUFF em relação aos parâmetros que aceita.
Os parâmetros aceitos pela SUBSTRING são os seguintes:
SUBSTRING ( STRING_VALUE , STARTING_POSITION, LENGTH)
O comando SUBSTRING é predominante na maioria dos principais bancos de dados padrão, como SQL Server, MySQL, Oracle e Postgres.
Vamos explorar a função SUBSTRING com vários exemplos.
Seção 1 – Exemplos simples de SUBSTRING
Neste primeiro exemplo, um valor de string de “ABC” será passado para a função SUBSTRING. Cada chamada terá o argumento de posição inicial incrementado em 1. O argumento de comprimento permanecerá 1 para cada chamada.
SELECT SUBSTRING('ABC',1,1); --RETURNS : A
SELECT SUBSTRING('ABC',2,1); --RETURNS : B
SELECT SUBSTRING('ABC',3,1); --RETURNS : C
A partir desses exemplos podemos ver a funcionalidade geral da função SUBSTRING, cada incremento na posição inicial desloca a letra retornada. Na execução #1 o valor é A, #2 o valor é B e na #3 o valor é C.
Um recurso interessante da função SUBSTRING é que o parâmetro de comprimento é ininterrupto se exceder o comprimento do valor que você está analisando. Por exemplo, o valor “1000” tem um comprimento de 4 dígitos. Se analisado com a seguinte consulta especificando um comprimento de 6, SUBSTRING retornará a string original.
SELECT SUBSTRING('1000',1,6); --RETURNS : 1000
Seção 2 – Analisando dados com a função SUBSTRING
Para o próximo exemplo, vamos supor que temos um banco de dados para manter dados sobre carros usados. No entanto, em vez de usar um modelo de dados relacional de várias tabelas, o banco de dados contém apenas uma chave primária e um SKU ou unidade de manutenção de estoque. Este SKU pode ser usado para encontrar vários campos em torno dos recursos de um carro usando a seguinte chave:
TOY-CEL-R-1990-150
-------------------------------------------------------
MAKE-MODEL-COLOR-YEAR-MILEAGE
*Nestes exemplos, a milhagem é representada em uma escala de 1/1.000, ou seja, 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
A saída da tabela de carros usados é:
ID | CAR_SKU |
1 | TOY-CEL-R-1990-150 |
2 | JEP-WRG-W-2019-15 |
3 | FRD-ESC-G-1998-80 |
Usando a função SUBSTRING, esses valores podem ser analisados atribuindo a posição inicial correta e os parâmetros de comprimento ao campo 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;
FAÇA | MODELO | COR | ANO | MILAGEM |
BRINQUEDO | CEL | R | 1990 | 150000 |
PEC | WRG | W | 2019 | 15.000 |
FRD | ESC | G | 1998 | 80.000 |
Seção 3 – Abstraindo a lógica SQL SUBSTRING para exibições
Usando a função SQL SUBSTRING, conseguimos analisar os vários recursos de cada veículo em nosso banco de dados. Vamos dar um passo adiante e traduzir essa saída em dados mais significativos criando uma visualização na consulta SUBSTRING.
Em um modelo de dados relacional, isso será obtido usando junções para incorporar a instrução CASE WHEN para traduzir os valores.
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
FAÇA | MODELO | COR | ANO | MILAGEM |
TOYOTA | CELICA | VERMELHO | 1990 | 150000 |
JIPE | WRANGLER | BRANCO | 2019 | 15.000 |
FORD | ESCAPE | VERDE | 1998 | 80.000 |
Seção 4 – SUBSTRING A alternativas para valores inteiros
A função SUBSTRING é explicitamente para valores de string, portanto, a consulta a seguir que tentar analisar um valor inteiro com SUBSTRING falhará.
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.
A alternativa ao analisar valores inteiros é a função LEFT ou RIGHT, embora essa abordagem perca um pouco da flexibilidade apresentada com a função SUBSTRING.
SELECT LEFT(10000,1); --RETURNS : 1
SELECT RIGHT(1000,1) ; --RETURNS : 0
Situacionalmente, você também pode converter explicitamente o valor inteiro como uma string e substring o valor convertido:
SELECT (SUBSTRING(CAST(1000 AS VARCHAR(4)),1,1)) AS CASTED_SUBSTRING -- RETURNS : 1
Resumo
Este artigo cobriu os parâmetros necessários para usar a função SUBSTRING, que é um forte argumento para uma posição inicial e um comprimento. Com um modelo de dados sem relação, usamos o método SUBSTRING para extrair os recursos do carro de uma tabela de 1 campo e construir uma visão com alguma lógica de transformação incorporada a ela.
O método SUBSTRING é uma ótima função para saber ao realizar ETL ou analisar os dados dentro de um banco de dados. Ele pode ser usado para extrair pontos de dados importantes significativos dos dados já existentes dentro de seu banco de dados.