MySQL에서 왜 이것이 거짓을 반환하는 경우가요?
-
07-07-2019 - |
문제
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*
둘 *
출연*
내가 의미하는 바를 알고 있다면 선은 동등한 비교를 보여줍니다.