我对MySQL中的IF()函数有疑问。
我想返回一个字符串并更改变量的值。好像:
IF(@firstRow=1, "Dear" AND @firstRow:=0, "dear")
这只输出'0'而不是'亲爱的'......
我非常感谢有关如何解决这个问题的一些意见!
路易斯:)
答案 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 。
答案 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 |
+---+------------+----------------+