12th Dec 2022 8 minutos de leitura Como usar a função COALESCE() em SQL Ignacio L. Bisso sql aprender sql COALESCE Índice O que faz a COALESCE()? Conheça os dados do exemplo Exemplo de Consultas SQL usando a função COALESCE() Exemplo 1: Use COALESCE() para Substituir NULL por um Rótulo Exemplo 2: Use COALESCE() ao concatenar NULL e Strings Exemplo 3: Use COALESCE() com Argumentos Múltiplos Exemplo 4: Use COALESCE() para substituir NULL por um Valor Calculado Exemplo 5: Use COALESCE() com a Cláusula ROLLUP Vantagem de COALESCE() Para processar valores NULL Os usuários SQL são freqüentemente confrontados com valores NULL em suas consultas e precisam processá-los corretamente. A função COALESCE() ajuda a lidar com os valores NULL. Leia este artigo para aprender como usar COALESCE() em suas consultas. As tabelas SQL armazenam dados em registros, e os registros são compostos de campos. Pode haver situações em que não sabemos o valor para um campo específico. Por exemplo, vamos supor que temos uma tabela com dados para persons. Tem os campos first_name, last_name, e marital_status. Quando não conhecemos o marital_status para uma determinada pessoa, SQL nos permite atribuir um valor NULL para este campo. Entretanto, o valor NULL não significa que a pessoa não tem um marital_status; significa apenas "não conhecemos esse valor". Em outras palavras, SQL usa valores NULL para representar a ausência de valor. Entretanto, os valores NULL podem ser complicados de manusear. É por isso que SQL incluiu a função COALESCE(), que é o que vamos falar neste artigo. Antes de começar os detalhes técnicos do NULL e COALESCE(), sugiro verificar nosso curso interativo em Funções Comuns em SQL. Ele contém uma revisão abrangente dos valores NULL, funções relacionadas ao NULL, e outras funções comuns em SQL. O que faz a COALESCE()? Em bancos de dados SQL, qualquer tipo de dado admite NULL como um valor válido; ou seja, qualquer coluna pode ter um valor NULL, independentemente do tipo de dado que seja. (Obviamente, algumas colunas serão obrigatórias (não-nuláveis), mas isto é definido pelo projetista do banco de dados, não o tipo de dados em si). Vamos mostrar um exemplo simples usando a tabela persons. first_namelast_namemarital_status CharlesLeclercsingle FernandoAlonsomarried GeorgeGraueNULL Podemos usar a função SQL COALESCE() para substituir o valor NULL por um texto simples: SELECT first_name, last_name, COALESCE(marital_status,'Unknown') FROM persons Na consulta acima, a função COALESCE() é utilizada para retornar o valor 'Unknown' somente quando marital_status é NULL. Quando marital_status não é NULL, COALESCE() retorna o valor da coluna marital_status. Em outras palavras, COALESCE() retorna o primeiro argumento não NULL. Conheça os dados do exemplo Para o restante do artigo, demonstraremos a função COALESCE() utilizando a tabela stockque é mostrado abaixo. productbrandsubcategorycategoryfamilyunitsquantity_availableminimum_to_have pork ribsNULLpork meatmeatfoodKilos400130 tomatoesMr RedNULLvegetablesfoodKilos280100 lettuceNULLLeaf vegetablesNULLfoodKilos280125 bananasBig BrasilNULLvegetablesfoodKilos450150 hamburgerMaxBurgcow meatmeatfoodBox245100 hamburgerRoyalBurgcow meatmeatfoodBox125NULL hamburgerSuperBurgaNULLNULLNULLBox20080 Esta tabela armazena registros de dados do produto para um mercado e inclui as colunas product, brand, subcategory, category, family, units, quantity_available (o estoque atual deste produto), e minimum_to_have (o limiar quando o mercado precisa encomendar este produto de seus fornecedores). Você notará que alguns dos produtos têm uma subcategoria, mas outros não. Por exemplo, o produto "costelas de porco" pertence à subcategoria "carne de porco" na categoria "carne" e a família "alimento". O produto "tomate" pertence à categoria "vegetais" e a família "alimento"; não tem uma subcategoria, portanto existe um NULL neste campo. Exemplo de Consultas SQL usando a função COALESCE() Agora, vamos ver como usar a função COALESCE() em alguns exemplos realistas. Exemplo 1: Use COALESCE() para Substituir NULL por um Rótulo Queremos mostrar todos os produtos com sua subcategoria, categoria e família. Entretanto, há alguns produtos com um NULL em sua categoria ou subcategoria. Para estes produtos, queremos exibir um texto: 'No Category' ou 'No Subcategory'. Aqui está a consulta que usaríamos: SELECT product, COALESCE(subcategory,'No Subcategory') AS subcategory, COALESCE(category,'No Category') AS category, COALESCE(family,'No Family') AS family FROM stock Estamos usando a função COALESCE() para substituir os valores NULL por um texto. Você pode ver o resultado abaixo: productsubcategorycategoryfamily pork ribspork meatmeatfood tomatoesNo Subcategoryvegetablesfood lettuceLeaf vegetablesNo Categoryfood bananasNo Subcategoryvegetablesfood hamburgercow meatmeatfood hamburgercow meatmeatfood hamburgerNo SubcategoryNo CategoryNo Family Exemplo 2: Use COALESCE() ao concatenar NULL e Strings Um problema SQL frequente relacionado com os valores NULL é a concatenação de cordas. Muitas operações envolvendo valores NULL retornam um valor NULL como resultado. Se quisermos concatenar duas cordas e uma delas for NULL, o resultado da concatenação será NULL. Aqui está uma simples concatenação de texto: SELECT 'Hello, how are you ' || 'Peter ' || '?' AS example Ele retorna: example Hello, how are you Peter ? Entretanto, se usarmos um texto NULL ... SELECT 'Hello, how are you ' || null || '?' AS example ... nós conseguimos: example NULL O resultado é NULL porque cada concatenação de texto envolvendo um valor NULL retorna um valor NULL. Para evitar isso, podemos usar a função COALESCE() para retornar uma string vazia (ou um espaço) em vez de um valor NULL. Por exemplo, suponha que queremos uma lista dos nomes dos produtos com o nome da marca. Podemos escrever a seguinte consulta: SELECT product || ', brand: ' || COALESCE(brand, '--') AS product_brand FROM stock Quando uma marca é NULL, colocaremos um '--' em vez de um NULL. Observe o resultado: product_brand pork ribs, brand: -- tomatoes, brand: Mr Red lettuce, brand: -- bananas, brand: Big Brazil hamburger, brand: MaxBurg hamburger, brand: RoyalBurg hamburger, brand: SuperBurga Exemplo 3: Use COALESCE() com Argumentos Múltiplos Você pode usar a função COALESCE() com mais de dois argumentos. Suponhamos que queremos um relatório que liste os produtos e suas subcategorias. Se a subcategoria for NULL, queremos substituir a subcategoria pela categoria. E se ambas subcategoria e categoria são NULL, queremos substituí-las pela família do produto. Vamos ver a consulta SQL: SELECT product ||' - '|| COALESCE(subcategory, category, family, 'no product description ') AS product_and_subcategory FROM stock Estamos usando a função COALESCE() com quatro argumentos; o primeiro argumento não NULL será retornado, como podemos ver no resultado abaixo: product_and_subcategory pork ribs - pork meat tomatoes - vegetables lettuce - leaf vegetables Bananas - vegetables hamburger - cow meat hamburger - cow meat hamburger - no product description Para mais detalhes sobre isto, sugiro o artigo How to Tackle SQL NULLs. Exemplo 4: Use COALESCE() para substituir NULL por um Valor Calculado A função SQL COALESCE() também pode ser usada para calcular ou estimar um valor quando este valor não está presente. Por exemplo, cada produto tem um limite (representado pela coluna minimum_to_have) que requer um novo pedido ao fornecedor. Entretanto, alguns registros poderiam ter um valor NULL na coluna minimum_to_have; neste caso, podemos definir que o limite será 50% da coluna quantity_available. A consulta para calcular a estimativa do valor limite é: SELECT product, quantity_available, minimum_to_have, COALESCE(minimum_to_have, quantity_available * 0.5) AS threshold FROM stock A função COALESCE() aqui retorna minimum_to_have quando o valor minimum_to_have não é NULL. Se minimum_to_have for NULL, então COALESCE() retornará quantity_available * 0.5 productquantity_availableminimum_to_havethreshold pork ribs400130130 tomatoes280NULL140 lettuce280125125 bananas450150150 hamburger245100100 hamburger125100100 hamburger2008080 Exemplo 5: Use COALESCE() com a Cláusula ROLLUP No próximo exemplo, usaremos a cláusula ROLLUP (uma extensão de GROUP BY) para obter a quantidade total de produtos que temos para cada subcategoria, incluindo um subtotal de produtos para cada categoria e família. Vamos ver a consulta: SELECT family, category, subcategory, SUM(quantity_available) as quantity_in_stock FROM stock GROUP BY ROLLUP(family, category, subcategory) ORDER BY family, category, subcategory A cláusula ROLLUP assume uma hierarquia entre as colunas family, category, e subcategory. Assim, ela gera todos os conjuntos de agrupamentos que fazem sentido considerando a hierarquia: GROUP BY family, GROUP BY family, category e GROUP BY family, category, subcategory. Esta é a razão pela qual ROLLUP é freqüentemente utilizada para gerar subtotais e totais gerais para relatórios. Vamos ver os resultados abaixo: familycategorysubcategoryquantity_in_stock foodmeatcow meat570 foodmeatpork meat400 foodmeatNULL970 foodvegetablesleaf vegetables280 foodvegetablesnon leaf vegetables730 foodvegetablesNULL1010 foodNULLNULL1980 NULLNULLNULL1980 Você pode ver alguns NULLs no resultado anterior. Cada NULL significa que esta coluna não estava presente no GROUP BY para o cálculo da quantidade em estoque. Por exemplo, estas linhas ... foodmeatNULL770 foodvegetablesNULL1010 ... são o resultado da execução de GROUP BY family, category. Esta é a razão para ter um NULL sob a coluna subcategory. Na próxima consulta, usaremos a função COALESCE() para melhorar a legibilidade do relatório. Substituiremos esses valores NULL por um texto que esclarece o motivo do NULL: SELECT COALESCE(family,'All Families') AS family, COALESCE(category,'All Categories') AS category, COALESCE(subcategory,'All Subcategories') AS subcategory, SUM(quantity_available) as quantity_in_stock FROM stock GROUP BY ROLLUP(family, category, subcategory) ORDER BY family, category, subcategory O resultado é: familycategorysubcategoryquantity_in_stock foodmeatCow meat570 foodmeatPork meat400 foodmeatAll Sub-Categories970 foodvegetablesLeaf vegetables280 foodvegetablesNon leaf vegetables730 foodvegetablesAll Subcategories1010 foodAll CategoriesAll Subcategories1980 All FamiliesAll CategoriesAll Subcategories1980 No resultado anterior, podemos observar como os valores NULL são substituídos por textos e as linhas dos relatórios com os textos começando com 'All' mostram um subtotal em quantity_in_stock. Gostaria de sugerir o artigo The SQL COALESCE Function: Manuseio dos valores NULL, se você quiser saber mais sobre isto. Vantagem de COALESCE() Para processar valores NULL Neste artigo, demonstramos várias maneiras de usar a função SQL COALESCE(). Cobrimos como usar COALESCE() para substituir valores NULL, como calcular um valor alternativo, e como combinar COALESCE() com a cláusula ROLLUP, entre outros exemplos. Antes de terminar, tenho outra recomendação para você. Nossa Folha de Consulta gratuita Funções Comuns em SQL permite que você encontre rapidamente detalhes sobre as funções embutidas do SQL, funções agregadas e muito mais. Eu a uso quase todos os dias quando trabalho com SQL. Você também pode experimentar nossa Funções Comuns em SQL curso, onde você pode aprender e praticar as funções SQL numéricas, de texto, data e NULL-handling. Aumente suas habilidades e aumente seus ativos! Tags: sql aprender sql COALESCE