Como converter um número inteiro para um booleano em uma cláusula MySQL SELECT?

29

Eu sou novo aqui, então seja gentil comigo. Eu tenho o seguinte cenário:

Eu tenho muitas tabelas que, por uma questão de simplicidade, são representadas em uma View no meu banco de dados MySQL. Meu problema é que preciso de um valor nessa exibição que represente se é um tipo de evento ou outro (um booleano simples), com o qual tentei obter:

`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement` AS `IsStopingEvent`

O resultado é representado como int e, portanto, é lido pelo Entity Framework. O problema é que eu realmente preciso de um valor de retorno booleano, com o qual tentei obter:

CAST((`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement`) as boolean) AS `IsStopingEvent` 

Isso resultou em um erro, que não é exibido para mim no MySQL Workbench (eu recebo apenas o irritante "Você tem um erro em ...").

Vocês podem me ajudar?

Tentei resolvê-lo no meu aplicativo, mas prefiro isso resolvido no banco de dados, pois ele será usado por outro software posteriormente.

Bruno
fonte

Respostas:

26

Tente usar a função SE:

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, TRUE, FALSE) 
FROM ...

ou

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 1, 0) 
FROM ...

Mesmo sem a função SE, executando

mysql> select ('rolando' = 'rolando') str_compare;
+-------------+
| str_compare |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql>

rendimento 0 ou 1 usando o cliente mysql

O problema é este: CAST () e CONVERT () só podem aceitar e retornar os seguintes tipos :

  • BINÁRIO [(N)]
  • CHAR [(N)]
  • ENCONTRO
  • DATA HORA
  • DECIMAL [(M [, D])]
  • ASSINADO [INTEGER]
  • TEMPO
  • NÃO ASSINADO [INTEGER]

Como o BOOLEAN não está nesta lista, ele nunca pode ser retornado por CAST ou CONVERT

Você poderia usar a função SE para gerar strings

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 'TRUE', 'FALSE') 
FROM ...
RolandoMySQLDBA
fonte
1
A boolean is an alias for tinyint. Under no circumstance does IF return a tinyint so I can't see how this answer is right or accepted.
Evan Carroll
@EvanCarroll Minha resposta tem como objetivo ignorar completamente o CAST e o CONVERT .. Usando a função IF, o que sua estrutura não fará, que é reconhecer o BOOLEAN como um INT (4 bytes) em vez de TINYINT (1 byte). Nesse caso, você culpa a estrutura por não trabalhar com os valores BOOLEAN.
RolandoMySQLDBA
10

Você pode fazer isso de maneira muito simples, sem usar a instrução IF () redundante:

... `YourField` IS NOT NULL AS `YourField` ...
Roman Newaza
fonte
Honestamente, essa é a maneira mais fácil. E funciona para o meu caso. Obrigado!
Mike Harrison
4

Você também pode tentar a coerção booleana clássica:

SELECIONE NÃO NÃO (tanto faz);

O bom disso é que preserva naturalmente NULLs, enquanto a maioria das respostas aqui não.

Se você deseja coagir NULL a FALSE, faça

SELECT IFNULL (NOT NOT (qualquer que seja), FALSE);

poseidonCore
fonte
1
Eu me pergunto, como isso consegue converter um número inteiro em booleano?
ypercubeᵀᴹ
2

Você também pode usar "CASE":

SELECT CASE WHEN yourField=testValue THEN 'TRUE' ELSE 'FALSE' END as boolFieldName

Zvezdochka
fonte
Você deve convertê-lo como booleano, se não for um campo char.
McNets
Às vezes, o consumidor da sua consulta deseja um personagem
Eric Wilson
2

Isso é atualmente impossível.

  • O MySQL não possui um BOOLEANtipo real (ou um tipo de matriz real .. ou um tipo JSON real). Tem um alias para TINYINT.
  • Qualquer condição retorna um número inteiro. Esse é o tipo de dados mais rápido para uma CPU e, presumivelmente, esse detalhe de implementação é refletido aqui. Por exemplo, 'true' IS TRUEe 1=1ambos retornam 1como um int.
  • O CAST não fornece um TINYINTformato.

Tanto quanto eu posso dizer, você não pode rebaixar um tipo, nem produzir um tinyint em um SELECT.

Eu altamente sugerem a migração para PostgreSQL. É muito menos aterrorizante ... e libertador.

Evan Carroll
fonte
2

Use a função mysql CAST_TO_BIT

Exemplos:

SELECT CAST_TO_BIT(1);

Mysql: SELECT CAST_TO_BIT (0) ; -> driver jdbc -> Java: Boolean false ;

Mysql: SELECT CAST_TO_BIT (1) ; -> driver jdbc -> Java: Boolean true ;

Mysql: SELECT CAST_TO_BIT (NULL) ; -> driver jdbc -> Java: NULL ;

Dharmendrasinh Chudasama
fonte