5

PHP에서 현재 다른 필드의 메일 주소를 컴파일하지만 다른 형식을 고려하는 함수가 있습니다. 다른 지역에서 사용됩니다. 나는 이것을 MySQL 저장 함수로 재현하려고한다. 데이터베이스보다는 코드에서 이런 종류의 일을하는 것이 더 빠르지 만 인트라넷은 사람들이 원시 MySQL SELECT 명령을 읽기 전용으로 입력하여 고급 검색을 구성하고 쿼리를 저장할 수있는 방법을 제공합니다. 이 특정 기능은 사용자가 고급 검색 쿼리 결과를 레이블 레이아웃으로 출력 할 수 있도록 사용됩니다.중첩 된 IF가있는 MySQL 저장 함수 ... END IF, 구문 오류, 근처에서 사용할 올바른 구문

나는 시도하고 나는 다음과 같은 오류가 얻을 (최신 안정)에 phpMyAdmin 3.4.9을 사용하여 기능을 저장하는 경우 : 같은 오류가

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 51 

가 나는 또한 최신 MySQL의 워크 벤치를 설치 얻을뿐만 아니라 그것은 강조 있어요 "SQL 구문 오류가 'END'근처에 있으므로 phpMyAdmin의 버그가 아닙니다 (phpMyAdmin 및 MySQL Workbench의 버그 일 수 있음).

다음은 함수 쿼리 :

DELIMITER ;; 
DROP FUNCTION IF EXISTS ADDRESS_BUILD;; 
CREATE FUNCTION ADDRESS_BUILD(contact VARCHAR(50), company VARCHAR(100), add1 VARCHAR(255), add2 VARCHAR(255), add3 VARCHAR(255), town_city VARCHAR(50), county_state VARCHAR(50), postcode_zip VARCHAR(50), country VARCHAR(100), `separator` VARCHAR(10), type VARCHAR(10)) 
RETURNS TEXT 
DETERMINISTIC 
BEGIN 
DECLARE address TEXT; 
DECLARE line TEXT; 

IF LENGTH(TRIM(contact))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(contact)); END IF; 
IF LENGTH(TRIM(company))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(company)); END IF; 
IF LENGTH(TRIM(add1))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add1)); END IF; 
IF LENGTH(TRIM(add2))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add2)); END IF; 
IF LENGTH(TRIM(add3))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add3)); END IF; 

IF country='United States of America' OR country='USA' OR country='Canada' OR country='CA' THEN 
    /* NORTH AMERICA, ALL ON 1 LINE */ 
    IF LENGTH(TRIM(town_city))>0 THEN 
     IF type='mail' THEN SET line=CONCAT_WS('', TRIM(town_city), ' '); 
     ELSE SET line=CONCAT_WS('', line, TRIM(town_city), ', '); 
     END IF; 
    END IF; 

    IF LENGTH(TRIM(county_state))>0 THEN 
     IF type='mail' THEN SET line=CONCAT_WS('', line, TRIM(county_state), ' '); 
     ELSE SET line=CONCAT_WS('', line, TRIM(county_state), ' '); 
     END IF; 
    END IF; 

    IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF; 

    SET address=CONCAT_WS(`separator`, address, TRIM(line)); 

ELSE IF country='United Kingdom' OR country='UK' THEN 
    /* UK, ASCENDING LOCALITY SEPARATE LINES */ 
    IF LENGTH(TRIM(town_city))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(town_city)); END IF; 
    IF LENGTH(TRIM(county_state))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(county_state)); END IF; 
    IF LENGTH(TRIM(postcode_zip))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(postcode_zip)); END IF; 

ELSE 
    /* EUROPE EVERYWHERE ELSE, ALL ON 1 LINE POSTCODE FIRST */ 
    IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF; 
    IF LENGTH(TRIM(town_city))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(town_city)); END IF; 
    IF LENGTH(TRIM(county_state))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(county_state)); END IF; 
    IF LENGTH(TRIM(line))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(line)); END IF; 
END IF; 

IF country='United States of America' THEN SET address=CONCAT_WS(`separator`, address, 'USA'); 
ELSE IF LENGTH(TRIM(country))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(country)); 
END IF; 

RETURN address; 
END;;

선 (51)는 IF, RETURN 및 END 조항이 거의 다하지만 난 그와 아무 잘못을 발견 할 수 없다.

누구든지 MySQL Workbench와 phpMyAdmin에서이 문제의 원인을 볼 수 있습니까?
일단 함수가 저장되면, 그것을 테스트하고 로직을 조정할 수 있습니다.

또한 간소화 할 수있는 기능이 있다면 알려주세요. 거기에 많은 예제가 없기 때문에 나는 이것을 함께 패치했습니다.

답변

7

난 내 자신의 질문에 대답하는거야 좋아. Yahia 덕분에 IF 문 구문을 다시 살펴 보았습니다.
나는이 질문을 망쳤다.

위의 항목은 2 ELSE IF입니다. http://dev.mysql.com/doc/refman/5.0/en/if.html 따른
적절한 구문은 실제로 ELSEIF I 단지 때문에 END IF들 또한 실제로 문서에서 확인한없이 공간 ELSE IF되어야한다는 것으로
.

그래서 MySQL은 ELSE IF를 ELSE로, 그리고 같은 레벨의 다른 분기 대신에 다른 중첩 된 IF의 시작으로 해석했습니다.

위의 쿼리는 일단 ELSE IF를 수정하면 phpMyAdmin에서 완벽하게 작동하지만 작성해야 할 로직을 약간 수정해야합니다.

내 모든 결함과 RTM!

2

당신이 END IF; 누락 - 마지막 라인을 변경 :

IF country='United States of America' THEN SET address=CONCAT_WS(`separator`, address, 'USA'); 
ELSE IF LENGTH(TRIM(country))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(country)); 
END IF; 
END IF; 

RETURN address; 
END;; 
+0

행운이 두렵다 : ( – batfastad

+0

@batfastad 그 'END IF;'는 아마도 누락 된 유일한 것이 아니지만 ... MySQL을 설치해 놓고 체크 아웃 할 필요가 없습니다 ... – Yahia

+0

공정하게, 나는 충분히 빨리 내 둥지가 일치하는지 확인합니다. – batfastad

5

기타 해결책. 기능을 사용해보십시오 :

DROP FUNCTION IF EXISTS test; 

DELIMITER $$ 
CREATE FUNCTION test(name VARCHAR(255), id INT) RETURNS INT 
BEGIN 
    DECLARE var_resp INT DEFAULT 0; 

    IF (LENGTH(TRIM(name)) > 0) THEN 
     UPDATE mytableset IDName= name WHERE mytable.ID = id 
     SET var_resp = 1; 
    END IF; 

    RETURN var_resp; 

END $$ 
DELIMITER ; 

감사합니다.