Exercício 6 – Tipo de dados
Cenário de laboratório
Foi lhe solicitado extrair os dados das pessoas registadas na base de dados da Adventure Works para ser reutilizado noutro sistema. É importante que alguns caracteres sejam removidos devido a não ser compatível com o novo sistema. Nenhum dado existente deve ser alterado.
Objetivos
Depois de concluir este laboratório, você será capaz de:
- Substituir texto numa consulta T-SQL.
Duração do laboratório
- Tempo estimado: 30 minutos
Tarefa 1 - Extrair o nome da pessoa registada se o apostrofe (15 minutos)
-
Utilize a base de dados Adventure Work.
Expanda esta seção para visualizar a solução.
USE AdventureWorks GO
-
Registre uma nova pessoa com o nome O’Neil Jackson utilizando as seguintes instruções.
SET IDENTITY_INSERT Person.BusinessEntity ON; GO INSERT INTO Person.BusinessEntity (BusinessEntityID, rowguid) VALUES(90001, NEWID()); GO INSERT INTO Person.Person(FirstName, LastName, BusinessEntityID, PersonType) VALUES('O''Neil','Jackson',90001,'EM'); GO
-
Escreva e execute uma consulta T-SQL que mostre a pessoa O’Neil Jackson sem apostrofe e o resultado é identificado como Pessoa tendo apenas uma coluna.
Expanda esta seção para visualizar a solução.
SELECT REPLACE(FirstName, '''', '') + ' ' + LastName AS Pessoa FROM Person.Person WHERE FirstName = 'O''Neil';
Resultado esperado
Pessoa ONeil Jackson -
Se na questão anterior utilizou + para concatenar strings (conjunto de texto) rescreva a consulta utilizando a função CONCAT.
Expanda esta seção para visualizar a solução.
SELECT CONCAT(Replace(FirstName, '''', ''), ' ',LastName) AS Pessoa FROM Person.Person WHERE FirstName = 'O''Neil';
Resultado esperado
Pessoa ONeil Jackson
Tarefa 2 - Substituir moradas que iniciam com o número zero a esquerda (15 minutos).
-
Utilize o operador LIKE para pesquisar todas as moradas que iniciem com o número zero na tabela Person.Address.
Expanda esta seção para visualizar a solução.
SELECT AddressID, AddressLine1 FROM Person.Address WHERE AddressLine1 LIKE '0%';
Resultado esperado
AddressID AddressLine1 29781 00, rue Saint-Lazare 24231 02, place de Fontenoy 19637 035, boulevard du Montparnasse 15671 081, boulevard du Montparnasse 13079 081, boulevard du Montparnasse 21354 084, boulevard du Montparnasse -
Utilize a função PATINDEX para obter a posição onde o primeiro zero ocorre.
Documentação PATINDEX (Transact-SQL)
Expanda esta seção para visualizar a solução.
SELECT PATINDEX('0%', AddressLine1) FROM Person.Address WHERE AddressLine1 LIKE '0%';
Resultado esperado
# (No column name) 1 1 2 1 3 1 4 1 5 1 6 1 -
Utilize a função SUBSTRING para remover o primeiro zero a esquerda.
Documentação PATINDEX (Transact-SQL)
Expanda esta seção para visualizar a solução.
SELECT SUBSTRING (AddressLine1, 2, LEN(AddressLine1) ) AS AddressLine1 FROM Person.Address WHERE AddressLine1 LIKE '0%';
Resultado esperado
- AddressLine1 1 0, rue Saint-Lazare 2 2, place de Fontenoy 3 35, boulevard du Montparnasse 4 81, boulevard du Montparnasse 5 81, boulevard du Montparnasse 6 84, boulevard du Montparnasse -
Com base da reposta dos exercícios anteriores utilize a expressão CASE para remover o primeiro zero quando este existir.
Expanda esta seção para visualizar a solução.
SELECT AddressID, CASE SUBSTRING(AddressLine1, 1, 1) WHEN '0' THEN SUBSTRING (AddressLine1, 2, LEN(AddressLine1) ) ELSE AddressLine1 END AS AddressLine1 FROM Person.Address WHERE AddressLine1 LIKE '0%';
Resultado esperado
- AddressLine1 1 0, rue Saint-Lazare 2 2, place de Fontenoy 3 35, boulevard du Montparnasse 4 81, boulevard du Montparnasse 5 81, boulevard du Montparnasse 6 84, boulevard du Montparnasse
Com o SQL Server 2022 esta tarefa podia ser resolvida com o a função LTRIM.