2013-04-07 5 views

답변

1

@ joachim-isaksson이 지적했듯이 MySql은이를 최적화하지 않는 것 같습니다. 그래서 당신은이를 사용할 수 있습니다.

SELECT 
    CASE WHEN (@check:=CheckTest(node.id, 1)) = 0 THEN NULL ELSE @check END as val 
+0

아 좋은 보이는 감사합니다! 내 문제는 비록 함수가 varchar를 반환하더라도 여전히 null로 설정할 수 있습니다. 실행하고 반환하기 전에 SET returnVar를 NULL로 변경해야합니다. 이전에 반환 된 값은 0으로 설정되었습니다. 나는 그것이 빈 세트에 의한 것이라고 잘못 생각했다. – user391986

+1

부수적으로, MySQL은 적어도 기능에 부작용이있을 때는 최적화하지 않는 것 같습니다. http://sqlfiddle.com/#!2/a4a07/7 –

+0

@JoachimIsaksson은 바이올린과 테스트에 감사드립니다 ... 내 대답을 편집했습니다. – fthiella

1
set @myvar := CheckTest(node.id, 1); 
select if(@myvar == 0, NULL, @myvar) as val; 
+0

정확히 어떻게 내가있는 그것의 쿼리의 일환으로 내 SELECT 쿼리에 node.id가 검색되기 때문에 것을 통합 할 – user391986

1

0으로 다시 변환됩니다 공집합이다 그래서 경우에도 VARCHAR이기 때문에 함수 자체에서 NULL을 반환 할 수없는 문제 MySQL은 이것을 최적화 할 것이므로, 프로파일 러를 사용하여 무슨 일이 일어나는지 확인해야합니다. SQLyog 또는 이와 유사한 방법으로 쿼리를 실행하십시오.

이런 종류의 이중 실행을 해결할 수있는 또 다른 방법이 있습니다.

먼저 임시 테이블을 만들고 CheckTest 조건을 만족하는 레코드로 채 웁니다.

그런 다음 기본 쿼리에서이 테이블과 조인을 만듭니다. 이렇게하면 각 레코드에 대해 정확히 한 번씩 테스트가 실행됩니다.

관련 문제