MySQL SELECT 절에서 정수를 부울로 캐스팅하는 방법은 무엇입니까?


29

나는 여기 새로 왔기 때문에 나에게 친절하십시오. 다음과 같은 시나리오가 있습니다.

단순화를 위해 MySQL 데이터베이스의 View에 표시되는 많은 테이블이 있습니다. 내 문제는 이벤트의 일종인지 또는 간단한 부울인지를 나타내는이 뷰에 값이 필요하다는 것입니다.

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

결과는 int로 표시되므로 Entity Framework에서 읽습니다. 문제는 실제로 부울 리턴 값이 필요하다는 것입니다.

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

이로 인해 MySQL Workbench에서 나에게 표시되지 않는 오류가 발생했습니다 (귀찮은 "당신은 오류가 있습니다 ...").

제발 도와주세요?

내 응용 프로그램에서 해결하려고 시도했지만 나중에 다른 소프트웨어에서 사용되기 때문에 데이터베이스 에서이 문제를 해결하는 것이 좋습니다.

답변:


26

IF 함수를 사용해보십시오 :

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

또는

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

IF 기능이 없어도

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

mysql>

mysql 클라이언트를 사용하여 0 또는 1을 산출하십시오

문제는 이것입니다. CAST ()CONVERT () 는 다음 유형 만 허용하고 리턴 할 수 있습니다 .

  • 이진 [(N)]
  • CHAR [(N)]
  • 날짜
  • 날짜 시간
  • 십진법 [(M [, D])]
  • 서명 [INTEGER]
  • 시각
  • 서명되지 않은 [INTEGER]

BOOLEAN이이 목록에 없으므로 CAST 또는 CONVERT에서 반환 할 수 없습니다.

IF 함수를 사용하여 문자열을 생성 할 수 있습니다

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

1
부울은의 별칭입니다 tinyint. 어떤 상황에서도 IFa를 반환 하지 않으므로이 tinyint답변이 옳은지 또는 받아 들여 지는지 알 수 없습니다.
Evan Carroll

@EvanCarroll 내 대답은 CAST 및 CONVERT를 무시하는 것입니다. IF 기능을 사용하면 프레임 워크가 수행하지 않는 작업을 수행합니다. 이는 BOOLEAN을 TINYINT (1 바이트)가 아닌 INT (4 바이트)로 인식합니다. 이 경우 BOOLEAN 값으로 작업하지 않는 프레임 워크를 비난했습니다.
RolandoMySQLDBA

10

중복 IF () 문을 사용하지 않고도 매우 간단한 방법으로 수행 할 수 있습니다.

... `YourField` IS NOT NULL AS `YourField` ...

솔직히 이것이 가장 쉬운 방법입니다. 그리고 내 경우에는 효과가 있습니다. 감사!
마이크 해리슨

4

고전적인 부울 강제 변환을 시도 할 수도 있습니다.

NOT NOT (무엇이든);

이것에 대한 좋은 점은 자연스럽게 NULL을 유지하지만 여기서 대부분의 대답은 그렇지 않습니다.

NULL을 FALSE로 강제하려면 다음을 수행하십시오.

선택 IFNULL (아무것도 아닙니다, FALSE);


1
이것이 정수를 부울로 변환하는 방법을 궁금합니다.
ypercubeᵀᴹ

2

"CASE"를 사용할 수도 있습니다.

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


숯불 필드가 아닌 경우 부울로 캐스트해야합니다.
McNets

때로는 쿼리 소비자가 캐릭터를 원할 수도 있습니다.
Eric Wilson

2

이것은 현재 불가능합니다.

  • MySQL에는 실제 BOOLEAN유형 (또는 실제 배열 유형 또는 실제 JSON 유형)이 없습니다. 에 대한 별칭이 TINYINT있습니다.
  • 모든 조건은 정수를 반환합니다. 이것은 CPU에 가장 빠른 데이터 유형이며 아마도이 구현 세부 사항이 여기에 반영됩니다. 예, 들어 'true' IS TRUE1=1모두 반환 1하여 AS int.
  • CAST는 TINYINT형식을 제공하지 않습니다 .

내가 알 수있는 한 유형을 강등하거나 a에서 tinyint를 생성 할 수 없습니다 SELECT.

나는 것이 매우 PostgreSQL을 마이그레이션하는 것이 좋습니다. 훨씬 덜 무섭고 해방 적입니다.


2

MySQL 함수 CAST_TO_BIT 사용

예 :

SELECT CAST_TO_BIT(1);

MySQL : SELECT CAST_TO_BIT (0) ; -> jdbc 드라이버-> Java : 부울 false ;

MySQL : SELECT CAST_TO_BIT (1) ; -> jdbc 드라이버-> Java : 부울 true ;

MySQL : SELECT CAST_TO_BIT (NULL) ; -> jdbc 드라이버-> Java : NULL ;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.