2017-11-18 4 views
0

MySQLのIF()関数に関する問題があります。MySQLでの2つのことIF()

私は文字列を返し、変数の値を変更したいと思います。 Somwhatのような:

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

これは私がこの問題を解決する可能性の方法にいくつかの入力のために非常に感謝するでしょう代わりに「親愛なる」...

の唯一の「0」を出力します!

ルイ:)

答えて

1

ANDはブール演算子ではなく、「また、この他のことを行う」演算子です。

"Dear" AND 0は、0がとして扱われ、<anything> AND falsefalseを返すため、0を返します。

また、整数/ブール値"Dear"も0であるためです。数値コンテキストで文字列を使用すると、文字列の最初の数字があればそれを読み込み、残りの文字は無視します。

あなたの問題は明らかではありませんが、行が結果セットの最初の行である場合、単語 "大事な"を大文字にしたいと思います。代わりにあなたの式に副作用に合うようにしようと半分にすぎ巧妙であることの

は、自分を支持を行うと、別の列にそれを破る:

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を。構文は、例えば従うことがはるかに容易であるよう

enter image description here

+0

私はそれがきれいではないことを知っているが、最初のバージョンが何らかの理由で動作しません、私はすでに... 2番目のバージョンはいえ正常に動作することをしようとした^^ありがとう! :) – siuol

+0

@シウォール、私は最初のクエリをテストし、正常に動作します。上記を参照して、私はテストしたものを貼り付けました。 –

1

代わりに、IF()のcase expressionを使用します

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

関連する問題