質問

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'

彼らのやり方を評価する...

役に立ちましたか?

解決

MySQL

から
  

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つの*スター付き<=>行は、意味がわかっている場合、同等の比較を示しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top