2011-02-07 3 views
1

mysql이 선언적 언어라는 사실 때문에 할당 변수 순서를 강제로 지정하는 방법을 찾을 수 없습니다. mysql 변수 할당 : 강제로 할당 순서를 지정하는 방법?

이 쿼리를 가지고 :

SET @v1=0; 
SET @v2=0; 

SELECT @v1, @v2 
FROM MyTable table 
WHERE (@v1:[email protected]) is not null 
    AND (@v2:=2) is not null; 

결과는 다음과 같습니다 @ v2의이 MySQL의 엔진에 의해 V1 @ 전에 구문 분석되기 때문에

@v1 | @v2 
--------- 
2 | 2 

이입니다.

@v1 | @v2 
--------- 
0 | 2 

편집 :이 같은 문제되지 않습니다 : 나는이 결과를 가지고 할당의 순서를 강제로 어떻게

여기 Variable assignment with mysql

은 할당 순서를하지 강제하는 방법에 대한 질문입니다 왜 결과는 예상 한 것이 아닙니다.

UPDATE : 당신이 가입 왼쪽 외부를 사용할 때 는, 결과도 이상하다 :이 경우

SET @v1=0; 

SELECT @v1 
FROM Account other 
LEFT OUTER JOIN SimpleValue f_PC ON f_PC.accountId=other.id AND f_PC.refShortcut='PC' 
WHERE CASE WHEN (other.context='44') THEN (@v1:[email protected]+1) ELSE null END 
ORDER BY @v1 ASC 

는 쿼리가 60 개 결과를 반환하지만 @ v1의 값은 내가 제거하면 120

입니다 왼쪽 외부 조인, v1 값은 60입니다. 왜?

+0

[mysql을 통한 변수 할당] 가능한 복제본 (http://stackoverflow.com/questions/4924021/variable-assignment-with-mysql) –

+0

왜이 질문을 다시 제기합니까? –

+0

이것은 같은 질문이 아닙니다. 다른 질문은 왜 이러한 결과가 나오는 것입니까? 이 질문은 이제 예상 결과를 얻으려면 어떻게해야합니까? StackOverflow는 포럼이 아니기 때문에 질문을 수정하고 변형하면 다른 질문을 읽은 사람들이 대답하지 않을 것이라고 생각하기 때문에 다른 질문을 더 선호합니다. –

답변

0

다른 질문에 대한 답변에서 설명하는 것처럼 작동하는 것이 보장되지 않습니다. 쿼리의 SELECT 부분에 할당을 이동 특정 경우

이 작동하는 것 같다 : 작동 있도록

SET @v1=0; 
SET @v2=0; 

SELECT (@v1:[email protected]), (@v2:=2) 
FROM DUAL 
+0

where 문에서 변수를 사용하고 select 문에서의 할당이 클라이언트에 응답을 보낼 때만 계산되기 때문에 select 문으로 이동할 수 없습니다. –

1

select 성명에서 절에서, 위에서 아래로, 왼쪽에서 오른쪽으로 간다 (MS Access는 동일한 전략을 사용함). 그러나 WHERE 절에서는 모든 베팅이 해제되고 최상의 필터가 선택됩니다. CASE 문에서 왼쪽에서 오른쪽으로의 평가 (프레젠테이션 순서 유지)가 필요하다는 사실을 이용하여 강제로 적용 할 수 있습니다.

WHERE CASE WHEN (@v1:[email protected]) is not null THEN (@v2:=2) ELSE (@v2:=2) = 0 END 

이 힘 평가 (및 v2 @ 2를 할당) 지점 중 하나에 있지만, 제 1 회 실행에 대해서만 @ v1을가하는 것입니다 : = @ V2는 null을 반환하고, @ v2는 0과 비교됩니다 2가된다 전체적으로 FALSE입니다. 두 번째로는 @v1 := @v2 [= 2]이고 (@v2:=2)은 2가됩니다 (즉, true).

+0

이 답변을 주셔서 감사하지만 왼쪽 외부 조인에서는 실행되지 않습니다. 내 업데이트보기;) –