문제

MySQL에서 if () 함수의 첫 번째 인수가 문자열 인 경우 왜 false를 반환합니까?

SELECT IF('string', 'string', 'not string'); -- 'not string'

물론 내가 그렇게했다면 이것을 고칠 수 있습니다.

IF(!ISNULL('string'), 'string', 'not string')) -- 'string'

또는

IFNULL('string', 'not string'); -- 'string'

그것이 보는 방식으로 문자열을 평가하는 것이 다소 반 직관적 인 것 같습니다.

SELECT IF(1, 'one', 'not one'); -- 'one'

그리고

SELECT IF('1', 'one', 'not one'); -- 'one'

그들이하는 방식을 평가하십시오 ...

도움이 되었습니까?

해결책

에서 MySQL

if (expr1, expr2, expr3)

expr1이 true 인 경우 (expr1 <> 0 및 expr1 <> null) if () expr2를 반환합니다. 그렇지 않으면 expr3을 반환합니다. if ()가 사용되는 컨텍스트에 따라 숫자 또는 문자열 값을 반환합니다.

1! = 0 및 1! = null이므로 1은 참입니다. 이것은 C에서 볼 수있는 것과 같습니다.

그러나 문자열의 경우, '테스트'가 True로 평가하는 것은 정의에 실질적인 근거가 없으며 논리적으로 의미가 없습니다. 부울 결과와 비교해야합니다.

다른 팁

주어진 첫 번째 주장 IF() 술어입니다. 문자열은 MySQL에 의해 술어로 간주되지 않으므로 기본값은 false입니다. 마지막 경우에는 많은 언어 (C, Perl 등)가 0이 아닌 정수를 고려하므로 MySQL은 단순히 해당 패러다임을 지원합니다.

'문자열'은 참도없고 거짓이 아니며 첫 번째 표현은 부울에게 평가해야하기 때문입니다.

if (1, ...)가 true로 평가하는 이유는 무엇입니까? 좋은 질문. 어쩌면 C 로의 후퇴 (예 : 1이면 사실입니다)?

편집 : 실제로, 명령의 정의에 의해 http://dev.mysql.com/doc/refman/55.0/en/control-flow-functions.html#function_if, expr1은 expr1 <> 0이고 expr1 <> null이면 사실입니다. 이는 expr1 == 1 일 때입니다.

PHP에는 유사점이 있습니다.

"string" != 0 // false
"one"    != 0 // false
"1"      != 0 // true

MySQL이 0 (및 null)과 비교하여 무언가의 부울 가치를 얻기 때문에 혼란이 발생하는 것 같습니다. PHP 및 JavaScript와 같은 다른 언어에서는 부울에 캐스트 될 때 문자열이 비어 있거나 "0"이 아님)를 반환합니다.

// php
0 == true          // false
"string" == 0      // true*
"string" == true   // true

// mysql
if(0, "true", "false")   // false
if("string", "true", "false") // false*

*출연* 내가 의미하는 바를 알고 있다면 선은 동등한 비교를 보여줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top