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
mascarar
fonte

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)

NinethSense
fonte
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
cs_alumnus
fonte
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).

Leonid Zakharov
fonte
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