2016-11-17 1 views
0

다음 저장된 프로시 저는 데이터베이스에 일치하는 데이터가 있어도 아무 것도 반환하지 않습니다.프로 시저 항상 빈 열을 반환합니다.

DELIMITER $$ 

    DROP PROCEDURE IF EXISTS `portaldb`.`hasPrivateCloud`$$ 

    CREATE DEFINER=`root`@`localhost` PROCEDURE `hasPrivateCloud`(in_userId int) 
    begin 
     if in_userId is not null then 
      select (case when ui.privateCloud is null 
        then false 
        else ui.privateCloud 
        end) as hasPrivateCloud from userinfo as ui where ui.userid = in_userId; 
     end if; 
    end$$ 

    DELIMITER ; 

privateCloud은 부울 필드입니다. 필드가 false이거나 where 절이 만족되지 않으면 프로시 저는 false을 리턴해야하고 where 절이 충족 될 때 프로시 듀어는 컬럼 값을 리턴해야합니다. 하지만 항상 빈 열을 반환합니다.

왜 그럴 수 있습니까?

+0

하지만 어쩌면이 다음에 유래 포스트 [선택에서 디스플레이 비트 값 (http://stackoverflow.com/questions/14248554/cant-see-mysql- bit-field-value-when-using-select) 도움이 될 것입니다 – g3suya

답변

1

레코드가 없으면 아무 것도 반환되지 않습니다. 당신이 생각하는 것처럼, NULL 레코드. 성능에 대해 너무 염려 할 때

당신은 당신도 이전 게시물에 대해 죄송

IF EXISTS (SELECT @result := privateCloud FROM userinfo WHERE userid = in_userId) 
    SELECT @result; 
ELSE 
    SELECT 'false'; 
END IF; 
+0

좋아요. 다만, privateCloud가 false의 경우에서도 true가 돌려 주어집니다. –

+0

고정 ........ – fancyPants

+0

쿼리를 두 번 실행하는 것보다 더 좋은 방법이 있습니까? –

0

을 할 수

IF EXISTS (SELECT privateCloud FROM userinfo WHERE userid = in_userId) 
    SELECT privateCloud FROM userinfo WHERE userid = in_userId; 
ELSE 
    SELECT 'false'; 
END IF; 

처럼 쓸 수 있습니다. 나는 그것을 삭제했다. 그 지적을위한 @fancyPants 감사합니다.

생각 나는 또 하나의 제안을 추가

select (case when ifnull(ui.privateCloud,false)=false 
       then 'False' 
       else 'True' 
       end) as hasPrivateCloud from userinfo as ui where ui.userid= in_userId; 
관련 문제