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 |
+---+------------+----------------+

Demo