MySQL IF() 中要做的两件事
Two things to do in MySQL IF()
我对 MySQL 中的 IF() 函数有疑问。
我想return一个字符串并改变一个变量的值。有点像:
IF(@firstRow=1, "Dear" AND @firstRow:=0, "dear")
这仅输出“0”而不是 'Dear'...
如果能提供一些解决此问题的方法,我将不胜感激!
路易斯 :)
AND
是布尔运算符,而不是 "also do this other thing" 运算符。
"Dear" AND 0
returns 0 因为 0 在 MySQL 中被视为 false
而 <anything> AND false
将 return false
.
也是因为"Dear"
的integer/boolean值也是0。在数字上下文中使用字符串只会读取字符串中的初始数字(如果有),而忽略其余部分。
不清楚你的问题是什么,但我想如果该行是结果集中的第一行,你想将单词 "dear" 大写。
不要太聪明地试图将副作用融入你的表达中,帮自己一个忙,把它分成一个单独的专栏:
mysql> SELECT IF(@firstRow=1, 'Dear', 'dear'), @firstRow:=0 AS _ignoreThis
-> FROM (SELECT @firstRow:=1) AS _init
-> CROSS JOIN
-> mytable;
+---------------------------------+-------------+
| IF(@firstRow=1, 'Dear', 'dear') | _ignoreThis |
+---------------------------------+-------------+
| Dear | 0 |
| dear | 0 |
| dear | 0 |
+---------------------------------+-------------+
但是如果你真的想让你的代码尽可能的混乱和不可读,你可以这样做:
SELECT IF(@firstRow=1, CONCAT('Dear', IF(@firstRow:=0, '', '')), 'dear')
FROM (SELECT @firstRow:=1) AS _init
CROSS JOIN
...
但请记住这个重要的代码质量指标:每分钟 WTFs。
使用 case expression
而不是 IF() 因为语法更容易理解,例如
select
case when @firstRow = 1 then 'Dear' else 'dear' end AS Salutation
, @firstRow := 0
from (
select 1 n union all
select 2 n union all
select 3
) d
cross join (SELECT @firstRow:=1) var
+---+------------+----------------+
| | Salutation | @firstRow := 0 |
+---+------------+----------------+
| 1 | Dear | 0 |
| 2 | dear | 0 |
| 3 | dear | 0 |
+---+------------+----------------+
我对 MySQL 中的 IF() 函数有疑问。
我想return一个字符串并改变一个变量的值。有点像:
IF(@firstRow=1, "Dear" AND @firstRow:=0, "dear")
这仅输出“0”而不是 'Dear'...
如果能提供一些解决此问题的方法,我将不胜感激!
路易斯 :)
AND
是布尔运算符,而不是 "also do this other thing" 运算符。
"Dear" AND 0
returns 0 因为 0 在 MySQL 中被视为 false
而 <anything> AND false
将 return false
.
也是因为"Dear"
的integer/boolean值也是0。在数字上下文中使用字符串只会读取字符串中的初始数字(如果有),而忽略其余部分。
不清楚你的问题是什么,但我想如果该行是结果集中的第一行,你想将单词 "dear" 大写。
不要太聪明地试图将副作用融入你的表达中,帮自己一个忙,把它分成一个单独的专栏:
mysql> SELECT IF(@firstRow=1, 'Dear', 'dear'), @firstRow:=0 AS _ignoreThis
-> FROM (SELECT @firstRow:=1) AS _init
-> CROSS JOIN
-> mytable;
+---------------------------------+-------------+
| IF(@firstRow=1, 'Dear', 'dear') | _ignoreThis |
+---------------------------------+-------------+
| Dear | 0 |
| dear | 0 |
| dear | 0 |
+---------------------------------+-------------+
但是如果你真的想让你的代码尽可能的混乱和不可读,你可以这样做:
SELECT IF(@firstRow=1, CONCAT('Dear', IF(@firstRow:=0, '', '')), 'dear')
FROM (SELECT @firstRow:=1) AS _init
CROSS JOIN
...
但请记住这个重要的代码质量指标:每分钟 WTFs。
使用 case expression
而不是 IF() 因为语法更容易理解,例如
select
case when @firstRow = 1 then 'Dear' else 'dear' end AS Salutation
, @firstRow := 0
from (
select 1 n union all
select 2 n union all
select 3
) d
cross join (SELECT @firstRow:=1) var
+---+------------+----------------+
| | Salutation | @firstRow := 0 |
+---+------------+----------------+
| 1 | Dear | 0 |
| 2 | dear | 0 |
| 3 | dear | 0 |
+---+------------+----------------+