MySQL IF()中要做的两件事

时间:2017-11-18 19:59:38

标签: mysql sql boolean-logic

我对MySQL中的IF()函数有疑问。

我想返回一个字符串并更改变量的值。好像:

IF(@firstRow=1, "Dear" AND @firstRow:=0, "dear")

这只输出'0'而不是'亲爱的'......

我非常感谢有关如何解决这个问题的一些意见!

路易斯:)

2 个答案:

答案 0 :(得分:1)

AND是一个布尔运算符,而不是"也是另外做的事情"操作

"Dear" AND 0返回0,因为在MySQL中0被视为false<anything> AND false将返回false

另外因为"Dear"的整数/布尔值也是0。在数字上下文中使用字符串只读取字符串中的初始数字(如果有),并忽略其余部分。

目前尚不清楚你的问题是什么,但我想你想要把这个词大写“亲爱的”#34;如果该行是结果集中的第一行。

不要过于聪明地试图将副作用放到你的表达中,而是帮自己一个忙,把它分成一个单独的专栏:

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

但请记住这一重要的代码质量指标:每分钟WTF

enter image description here

答案 1 :(得分:1)

使用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