AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 43352
Accepted
Juan Velez
Juan Velez
Asked: 2013-05-30 10:33:24 +0800 CST2013-05-30 10:33:24 +0800 CST 2013-05-30 10:33:24 +0800 CST

A instrução CASE do SQL Server avalia todas as condições ou sai na primeira condição TRUE?

  • 772

A instrução SQL Server (2008 ou 2012, especificamente) CASEavalia todas as WHENcondições ou sai quando encontra uma WHENcláusula avaliada como verdadeira? Se ele passar por todo o conjunto de condições, isso significa que a última condição avaliada como verdadeira substitui o que a primeira condição avaliada como verdadeira fez? Por exemplo:

SELECT
    CASE
        WHEN 1+1 = 2 THEN'YES'
        WHEN 1+1 = 3 THEN 'NO'
        WHEN 1+1 = 2 THEN 'NO' 
    END

O resultado é "SIM" mesmo que a última condição quando deva fazer com que seja avaliado como "NÃO". Parece que ele sai assim que encontra a primeira condição TRUE. Alguém pode confirmar se é o caso .

sql-server t-sql
  • 4 4 respostas
  • 119975 Views

4 respostas

  • Voted
  1. Best Answer
    James Jenkins
    2013-05-30T10:36:09+08:002013-05-30T10:36:09+08:00

    •Retorna a expressão_resultado da primeira expressão_entrada = quando_expressão que é avaliada como TRUE .

    Referência https://learn.microsoft.com/sql/t-sql/language-elements/case-transact-sql


    Este é o comportamento padrão do SQL:

    • Uma CASEexpressão é avaliada para a primeira condição verdadeira.

    • Se não houver uma condição verdadeira, ele avalia a ELSEpeça.

    • Se não houver condição verdadeira e nenhuma ELSEparte, ela será avaliada como NULL.

    • 60
  2. Leigh Riffel
    2013-05-30T11:07:31+08:002013-05-30T11:07:31+08:00

    O SQL Server geralmente faz avaliação de curto-circuito para instruções CASE ( SQLFiddle ):

    --Does not fail on the divide by zero.
    SELECT 
       CASE 
          WHEN 1/1 = 1 THEN 'Case 1'
          WHEN 2/0 = 1 THEN 'Case 2'
       END;
    
    --Fails on the divide by zero.
    SELECT 
       CASE 
          WHEN 1/1 = 99 THEN 'Case 1'
          WHEN 2/0 = 99 THEN 'Case 2'
       END;  
    

    No entanto, existem vários tipos de instruções que, a partir do SQL Server 2012, não causam curto-circuito corretamente. Veja o link do ypercube nos comentários.

    Oracle sempre faz avaliação de curto-circuito . Consulte a Referência de linguagem SQL 11.2 . Ou compare o seguinte ( SQLFiddle ):

    --Does not fail on the divide by zero.
    SELECT
      CASE 
        WHEN 1/1 = 1 THEN 'Case 1'
        WHEN 2/0 = 1 THEN 'Case 2'
      END
    FROM dual;
    
    
    --Fails on the divide by zero.
    SELECT
      CASE 
        WHEN 1/1 = 99 THEN 'Case 1'
        WHEN 2/0 = 99 THEN 'Case 2'
      END
    FROM dual;
    

    Este mesmo teste não pode ser feito com o MySQL porque retorna NULL para divisão por zero. ( SQL violino )

    • 19
  3. Kenneth Fisher
    2013-05-30T12:07:35+08:002013-05-30T12:07:35+08:00

    Parece que o MS SQL Server também usa uma avaliação de curto-circuito.

    No teste a seguir eu tenho 3 testes. O primeiro é sempre verdadeiro, o segundo falha sem fazer referência à tabela e o terceiro falha apenas quando os dados são levados em consideração.
    Nesta execução específica, ambas as linhas são retornadas com sucesso. Se eu comentar o primeiro QUANDO, ou o primeiro e o segundo, recebo falhas.

    CREATE TABLE casetest (test varchar(10))
    GO
    INSERT INTO casetest VALUES ('12345'),('abcdef')
    GO
    
    SELECT CASE WHEN LEN(test)>1 THEN test
            WHEN 1/0 = 1 THEN 'abc'
            WHEN CAST(test AS int) = 1 THEN 'def'
            END
    FROM casetest
    GO
    
    • 8
  4. abdelmoniem hafez
    2015-01-25T03:11:30+08:002015-01-25T03:11:30+08:00

    se a instrução case usada na WHEREcondição e a primeira instrução case when envolverem a avaliação de valores de coluna da tabela, e a primeira linha da tabela não atender a essa condição, a instrução case irá para a instrução case when seguinte.

    declare @tbl table(id int)
    insert into @tbl values(1)
    insert into @tbl values(2)
    insert into @tbl values(3)
    
    --Fails on the divide by zero.
    SELECT * FROM @tbl
    where  CASE 
            WHEN id = 2 THEN 1 -- first row in table will not satisfy the condition
            WHEN 2/0 = 1 THEN 1
            ELSE 0
          END =1
    
    -- when filter the records to only who will staisfy the first case when condition, it 
    will not fail on the divide by zero
    SELECT * FROM @tbl
    where ID=2 and -- first row in table will  satisfy the condition
      CASE 
        WHEN id = 2 THEN 1
        WHEN 2/0 = 1 THEN 1
        ELSE 0
      END =1
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve