MySQLでは、なぜこのIFはfalseを返しますか?
-
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'
and
SELECT IF('1', 'one', 'not one'); -- 'one'
彼らのやり方を評価する...
解決
IF(expr1、expr2、expr3)
expr1がTRUE(expr1 <!> lt; <!> gt; 0およびexpr1 <!> lt; <!> gt; NULL)の場合、IF()は戻ります expr2;それ以外の場合、expr3を返します。 IF()は数値または文字列を返します 値、コンテキストに応じて 使用されます。
1!= 0および1!= NULLであるため、1は真です。これは、Cで表示されるようなものです。
しかし、文字列の場合、「テスト」がtrueと評価されるということは、定義には実際の根拠がなく、論理的な意味を持ちません。ブール値の結果を得るには、何かと比較する必要があります。
他のヒント
IF()
に指定される最初の引数は述語。文字列はMySQLによって述語と見なされないため、デフォルトはfalseです。最後のケースに関しては、多くの言語(C、Perlなど)がゼロ以外の整数を真と見なしているため、MySQLは単にそのパラダイムをサポートしています。
「string」は真でも偽でもないため、最初の式はブール値に評価される必要があります。
IF(1、...)が真と評価されるのはなぜですか?良い質問。 Cへの先祖返りかもしれません(つまり、1の場合、それは本当です)?
編集:実際には、 http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if 、expr1 <!> lt; <!> gtの場合、expr1はTRUEです。 ; 0およびexpr1 <!> lt; <!> gt; NULL。expr1== 1の場合です。
PHPには類似点があることに注意してください:
"string" != 0 // false
"one" != 0 // false
"1" != 0 // true
MySQLが0(およびnull)と比較してブール値を取得するため、混乱が生じているようです。 PHPやJavascriptなどの他の言語では、文字列はブール値にキャストされると、空ではない(または<!> quot; 0 <!> quot;ではない)ときにtrueを返します。
// php
0 == true // false
"string" == 0 // true*
"string" == true // true
// mysql
if(0, "true", "false") // false
if("string", "true", "false") // false*
2つの*
スター付き<=>行は、意味がわかっている場合、同等の比較を示しています。