이 함수를 두 번 실행하지 못하게하려면 어떻게해야합니까? 두 번 실행하거나 mysql이이를 최적화합니까?IF 문에서 함수 호출을 두 번 방지합니다.
IF(CheckTest(node.id, 1) == 0, NULL, CheckTest(node.id, 1)) as val
반환 값은 그것이 내가 생각하지만
이 함수를 두 번 실행하지 못하게하려면 어떻게해야합니까? 두 번 실행하거나 mysql이이를 최적화합니까?IF 문에서 함수 호출을 두 번 방지합니다.
IF(CheckTest(node.id, 1) == 0, NULL, CheckTest(node.id, 1)) as val
반환 값은 그것이 내가 생각하지만
@ joachim-isaksson이 지적했듯이 MySql은이를 최적화하지 않는 것 같습니다. 그래서 당신은이를 사용할 수 있습니다.
SELECT
CASE WHEN (@check:=CheckTest(node.id, 1)) = 0 THEN NULL ELSE @check END as val
set @myvar := CheckTest(node.id, 1);
select if(@myvar == 0, NULL, @myvar) as val;
정확히 어떻게 내가있는 그것의 쿼리의 일환으로 내 SELECT 쿼리에 node.id가 검색되기 때문에 것을 통합 할 – user391986
0으로 다시 변환됩니다 공집합이다 그래서 경우에도 VARCHAR이기 때문에 함수 자체에서 NULL을 반환 할 수없는 문제 MySQL은 이것을 최적화 할 것이므로, 프로파일 러를 사용하여 무슨 일이 일어나는지 확인해야합니다. SQLyog 또는 이와 유사한 방법으로 쿼리를 실행하십시오.
이런 종류의 이중 실행을 해결할 수있는 또 다른 방법이 있습니다.
먼저 임시 테이블을 만들고 CheckTest 조건을 만족하는 레코드로 채 웁니다.
그런 다음 기본 쿼리에서이 테이블과 조인을 만듭니다. 이렇게하면 각 레코드에 대해 정확히 한 번씩 테스트가 실행됩니다.
아 좋은 보이는 감사합니다! 내 문제는 비록 함수가 varchar를 반환하더라도 여전히 null로 설정할 수 있습니다. 실행하고 반환하기 전에 SET returnVar를 NULL로 변경해야합니다. 이전에 반환 된 값은 0으로 설정되었습니다. 나는 그것이 빈 세트에 의한 것이라고 잘못 생각했다. – user391986
부수적으로, MySQL은 적어도 기능에 부작용이있을 때는 최적화하지 않는 것 같습니다. http://sqlfiddle.com/#!2/a4a07/7 –
@JoachimIsaksson은 바이올린과 테스트에 감사드립니다 ... 내 대답을 편집했습니다. – fthiella