Como obter o máximo de dois valores no MySQL?


289

Eu tentei, mas falhei:

mysql> select max(1,0);
ERRO 1064 (42000): você tem um erro na sua sintaxe SQL; verifique o manual
que corresponde à sua versão do servidor MySQL para a sintaxe correta a ser usada 
próximo a '0)' na linha 1

Respostas:


527

Use GREATEST ()

Por exemplo:

SELECT GREATEST(2,1);

Nota: Sempre que qualquer valor único contiver nulo nesse momento, essa função sempre retornará nulo (Graças ao usuário @ sanghavi7)


41
é preciso ter em mente que sempre que algum valor único contiver nulo naquele momento, essa função sempre retornará nulo como resposta!
sanghavi7

33
Há tambémLEAST
bobobobo

1
Como posso executar uma consulta sub como parâmetro para GREATESTpara que eu possa obter valores para uma coluna Cirtain
Junaid Qadir

17
Para evitar o problema com null, você pode usar ifnull. Por exemplo select greatest(date1, ifnull(date2, "0000-00-00 00.00:00")) from table1 where date2 is null;, você terá date1.
Christoph Grimmer-Dietrich

1
Se alguns valores puderem ser nulos, você pode fazerGREATEST(COALESCE(column1, 0), COALESCE(column2, 0))
Sean the Bean

27

Para obter o valor máximo de uma coluna em um conjunto de linhas:

SELECT MAX(column1) FROM table; -- expect one result

Para obter o valor máximo de um conjunto de colunas, literais ou variáveis ​​para cada linha:

SELECT GREATEST(column1, 1, 0, @val) FROM table; -- expect many results

3
Cuidado com os valores nulos com GREATEST. Qualquer valor nulo fará com que a função retorne nulo. Para evitar isso, você pode fazerGREATEST(COALESCE(column1, 0), COALESCE(column2, 0))
Sean the Bean

5

Você pode usar a função MAIOR com campos não anuláveis. Se um desses valores (ou ambos) puder ser NULL, não use-o (o resultado pode ser NULL).

select 
    if(
        fieldA is NULL, 
        if(fieldB is NULL, NULL, fieldB), /* second NULL is default value */
        if(fieldB is NULL, field A, GREATEST(fieldA, fieldB))
    ) as maxValue

Você pode alterar NULL para o seu valor padrão preferido (se os dois valores forem NULL).


1
É por isso que eu honestamente odeio o MySQL. Que quantidade tremenda de trabalho para fazer uma coisa tão simples.
Monica Heddneck 2/17/17

9
Isso pode ser simplesmente substituído por select COALESCE(GREATEST(fieldA, fieldB),fieldA,fieldB) as maxValue. É complicado
demais

1
Se alguns valores puderem ser nulos, você pode fazê-lo #GREATEST(COALESCE(column1, 0), COALESCE(column2, 0))
Sean the Bean
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.