在MySQL中,如果返回false,为什么会出现这种情况?

在MySQL中,如果返回false,为什么会出现这种情况?,mysql,if-statement,Mysql,If Statement,在MySql中,如果if()函数的第一个参数是字符串,为什么返回false SELECT IF('string', 'string', 'not string'); -- 'not string' 当然,如果我这样做了,我可以解决这个问题 IF(!ISNULL('string'), 'string', 'not string')) -- 'string' 或 它对字符串的求值方式似乎有点违反直觉,正如它所看到的那样 SELECT IF(1, 'one', 'not one'); -- 'on

在MySql中,如果if()函数的第一个参数是字符串,为什么返回false

SELECT IF('string', 'string', 'not string'); -- 'not string'
当然,如果我这样做了,我可以解决这个问题

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

它对字符串的求值方式似乎有点违反直觉,正如它所看到的那样

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


计算它们的方式…

因为“string”既不是真的也不是假的,并且第一个表达式的计算结果应该是布尔值

为什么IF(1,…)的计算结果为true?好问题。可能是回到C(即,如果它是1,那么它是真的)

编辑:实际上,根据at命令的定义,如果expr1为0且expr1为NULL,则expr1为TRUE,这是expr1==1时的情况。

。MySQL不认为字符串是谓词,因此默认为false。至于最后一个案例,很多语言(C,Perl等)认为非零整数是真的,所以MySQL只是支持这个范例。

IF(expr1、expr2、expr3)

如果expr1为TRUE(expr10和expr1为NULL),则If()返回 expr2;否则返回expr3。 IF()返回数字或字符串 值,具体取决于中的上下文 它被使用了

所以1是真的,因为1!=0和1!=无效的这就像你在C中看到的一样


但是对于字符串来说,说“test”的计算结果为true在定义中没有实际依据,也没有逻辑意义。需要将其与布尔结果进行比较。

注意,PHP中有相似之处:

"string" != 0 // false
"one"    != 0 // false
"1"      != 0 // true
这种混淆似乎是因为MySQL比较0(和null)来获得某个东西的布尔值。在其他语言中,如PHP和Javascript,当转换为布尔值时,字符串在非空(或非“0”)时返回true


如果你知道我的意思的话,那两行星号表示等价的比较。

你完全正确,但显然MySQL的处理方式有所不同,也就是说,人们期望在expr1中出现数字或布尔运算,这将阻止使用字符串作为表达式。请选择IF('1','one','notone');返回'one'和what do SELECT
IF('2','two','nottwo')做什么??
SELECT IF('1', 'one', 'not one'); -- 'one'
"string" != 0 // false
"one"    != 0 // false
"1"      != 0 // true
// php
0 == true          // false
"string" == 0      // true*
"string" == true   // true

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