2017-11-18 9 views
0

MySQL의 IF() 함수에 관한 문제가 있습니다.MySQL에서해야 할 두 가지 사항 IF()

문자열을 반환하고 변수 값을 변경하고 싶습니다. Somwhat 등 :

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

에만 출력 '0'대신에 '친애하는'의 ...

을 나는이 문제를 해결할 수있는 방법에 대한 몇 가지 입력을위한 매우 감사 할 것입니다!

루이 :

답변

1

AND는 부울 연산자가 아닌 "이 다른 일을"연산자입니다.

"Dear" AND 0은 0을 false으로 처리하고 <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

나는 그것이 그 깨끗한 아니라고 알고 있지만 첫 번째 버전은 어떤 이유로 작동하지 않습니다, 나는 이미 ... 두 번째 버전 ^^ 감사하지만 잘 작동 것을 시도했다! :) – 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