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 / 187090
Accepted
Evan Carroll
Evan Carroll
Asked: 2017-09-28 10:57:44 +0800 CST2017-09-28 10:57:44 +0800 CST 2017-09-28 10:57:44 +0800 CST

O SQL Server suporta MAIOR e MENOR, se não, qual é a solução comum?

  • 772

Revendo esta pergunta , parece que há muito trabalho que não deveria ser necessário. Eles estão tentando estender um intervalo com uma data. Em outros bancos de dados, você usaria apenas greateste least..

least(extendDate,min), greatest(extendDate,max)

Quando eu tento usá-los, porém, recebo

'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.

Isso cobriria a extensão em qualquer direção.

Para os propósitos da pergunta, você ainda teria que fazer a substituição de intervalo exclusivo.

Eu só estou querendo saber como os usuários do SQL Server implementam padrões de consulta para imitar leaste greatestfuncionalidade.

  • PostgreSQL GREATEST/LEAST
  • MySQL GREATEST/LEAST
  • MariaDBGREATEST LEAST
  • DB2GREATEST LEAST
  • OráculoGREATEST LEAST

Você desdobra as condições em CASEdeclarações ou existe uma extensão, complemento de terceiros ou licença da Microsoft que habilita essa funcionalidade?

sql-server t-sql
  • 8 8 respostas
  • 65753 Views

8 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2017-09-28T12:33:33+08:002017-09-28T12:33:33+08:00

    Um método comum é usar a VALUEScláusula e CROSS APPLYas duas colunas com alias como uma única coluna e, em seguida, obter o MINe MAXde cada uma.

    SELECT MIN(x.CombinedDate) AS least, MAX(x.CombinedDate) AS greatest
    FROM   dbo.Users AS u
    CROSS APPLY ( VALUES ( u.CreationDate ), ( u.LastAccessDate )) AS x ( CombinedDate );
    

    Existem outras maneiras de escrevê-lo, por exemplo, usandoUNION ALL

    SELECT MIN(x.CombinedDate) AS least, MAX(x.CombinedDate) AS greatest
    FROM   dbo.Users AS u
    CROSS APPLY ( SELECT u.CreationDate UNION ALL SELECT u.LastAccessDate ) AS x(CombinedDate);
    

    No entanto, os planos de consulta resultantes parecem ser os mesmos.

    O SQL Server agora dá suporte a essas duas funções no Azure SQL DB e, presumivelmente, elas estarão disponíveis no local para o SQL Server 2022.

    • 39
  2. David Browne - Microsoft
    2017-09-28T14:10:04+08:002017-09-28T14:10:04+08:00

    Você também pode colocar os valores embutidos em uma subconsulta. Assim:

    select (select max(i) from (values (1), (2), (5), (1), (6)) AS T(i)) greatest,
           (select min(i) from (values (1), (2), (5), (1), (6)) AS T(i)) least
    
    • 22
  3. Dave Markle
    2021-04-18T08:48:24+08:002021-04-18T08:48:24+08:00

    GREATESTe LEASTagora têm suporte no Azure SQL e terão suporte no SQL Server 2022.

    • 13
  4. Elnur
    2018-09-21T02:39:19+08:002018-09-21T02:39:19+08:00

    MENOS equivalente:

    IIF(@a < @b, @a, @b)
    

    MAIOR equivalente:

    IIF(@a > @b, @a, @b)
    
    • 9
  5. Conor Cunningham MSFT
    2021-11-17T05:26:36+08:002021-11-17T05:26:36+08:00

    Para sua informação, implementamos MAIOR e MENOS no Azure SQL DB e nas próximas versões do SQL Server:

    https://learn.microsoft.com/en-us/sql/t-sql/functions/logical-functions-greatest-transact-sql?view=sql-server-ver15

    • 6
  6. Jim Gettma
    2018-08-17T15:10:33+08:002018-08-17T15:10:33+08:00

    Este seria um bom começo -

    CASE WHEN A > B THEN A ELSE B END
    
    • 4
  7. Bogdan Mart
    2019-01-02T15:19:43+08:002019-01-02T15:19:43+08:00

    Eu pretendia adicionar um comentário à resposta do @ed-avis, mas não consegui, devido à falta de reputação, então postei isso como extensão da resposta dele.

    Eu eliminei a desvantagem de "Irritantemente você tem que fazer funções separadas para cada tipo de dados." Usando SQL_VARIANT .

    Aqui está minha implementação:

    CREATE OR ALTER FUNCTION my_least(@a SQL_VARIANT, @b SQL_VARIANT)
    returns SQL_VARIANT
    with schemabinding
    as
    begin
      return case when @a <= @b then @a 
                  when @b < @a  then @b
                  WHEN @a IS NULL THEN @b
                  WHEN @b IS NULL THEN @a
                  else null
             end
    END;
    

    Além disso, esta função lida com NULL s como a versão postgresql.

    Essa função pode ser adicionada ao banco de dados por conveniência, mas é 10 vezes mais lenta do que usar o IIF. Meus testes mostram que essa função com tipo exato ( datetime ) executa o mesmo que a versão sql_variant .

    PS Eu executo alguns testes no conjunto de dados de 350k valores e parece que o desempenho é o mesmo, sql_variant é um pouco mais rápido, mas acredito que seja apenas jitters.

    Mas de qualquer forma a versão IIF é 10x mais rápida!!!

    Eu não testei inline, CASE WHENmas basicamente para t-sql IIF é o mesmo que case e iif get é convertido pelo otimizador para a expressão case.

    O fato de o IIF ser traduzido em CASE também tem impacto em outros aspectos do comportamento desta função.

    CONCLUSÃO: É mais rápido usar IIF se o desempenho for importante, mas para prototipagem, ou se a clareza do código for mais necessária, e não houver grandes cálculos envolvidos, desde que a função possa ser usada.

    • 3
  8. Ed Avis
    2018-03-07T02:35:43+08:002018-03-07T02:35:43+08:00

    Eu crio funções definidas pelo usuário, por exemplo

    create function dbo.udf_LeastInt(@a int, @b int)
    returns int
    with schemabinding
    as
    begin
      return case when @a <= @b then @a 
                  when @b < @a  then @b
                  else null
             end
    end
    

    Você também pode fazer um usando sql_variantem vez de int, que funcionará com qualquer tipo. (Infelizmente, ele sofre com as regras de conversão de tipo 'úteis' do MSSQL, retornando sem sentido se chamado com (1, 'a')em vez de um erro.) Pelo menos o desempenho com sql_variantnão parece pior do que a versão para um tipo específico.

    Embora possa funcionar em casos simples, existem vários problemas com essa abordagem:

    • Irritantemente você tem que fazer funções separadas para cada tipo de dados.
    • Ele lida com apenas 2 parâmetros, portanto, pode-se precisar de mais funções para lidar com muitos parâmetros ou usar chamadas aninhadas das mesmas funções.
    • Seria melhor (mais eficiente) como um TVF embutido em vez de uma função escalar. Isso tem a ver com a implementação de funções escalares no coração. Existem muitos blogs sobre isso, veja por exemplo SQL 101: Parallelism Inhibitors – Scalar User Defined Functions (por John Kehayias . (No entanto, as versões mais recentes do MSSQL podem otimizar melhor as funções escalares.)
    • Além dos problemas com funções escalares e otimização de consulta, mesmo em uma consulta direta, uma expressão iifou escrita à mão caseé cerca de dez vezes mais rápida que a chamada de função.
    • Se um dos argumentos for nulo, ele retornará nulo. Isso corresponde ao que o leastoperador faz no Oracle e no MySQL, mas difere do Postgres. Mas essa blindagem contra null o torna mais detalhado (se você sabe que eles não serão null, um simples case when @a <= @b then @a else @b endfuncionaria).

    Em suma, pode ser melhor escrever a caseexpressão à mão se o desempenho for importante. Eu até recorri à geração de caseinstruções aninhadas no lado do cliente quando há vários valores para comparar.

    • 1

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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