2016-09-12 2 views
0

웹 프로젝트의 프런트 엔드에 적용된 필터에 따라 6 개의 변수가 포함될 수도 있고 그렇지 않을 수도있는 저장 프로 시저가 있습니다. 그러나 현재이 저장 프로 시저는 모든 필터가 null로 설정되어 있어도 아무 것도 반환하지 않습니다. 차이점이 있다면 MySQL Workbench를 사용하고 있습니다. 이전에는 적용된 필터에 따라 별도의 저장 프로 시저를 사용했지만 필터를 추가 할 때 관리하기가 너무 어려워졌습니다.MYSQL 변수가 null 인 경우 where 절을 무시합니다.

CREATE DEFINER=`root`@`localhost` PROCEDURE `spFiltersGet`(IN jAlertId int, IN timeFrom timestamp, IN timeTo timestamp, IN seconds int, IN alertStatus varchar(255), IN jHostName varchar(255)) 
BEGIN 
DECLARE timeFromVal TIMESTAMP; 
DECLARE timeToVal TIMESTAMP; 
DECLARE fetchVal INT; 
DECLARE offsetVal INT; 
DECLARE alertIdVal INT; 
DECLARE secondsVal INT; 
DECLARE statusVal varchar(255); 
DECLARE hostVal varchar(255); 

SET timeFromVal = timeFrom; 
SET timeToVal = timeTo; 
SET fetchVal = 10; 
SET offsetVal = 0; 
SET alertIdVal = jAlertId; 
SET secondsVal = seconds; 
SET statusVal = alertStatus; 
SET hostVal = jHostName; 

SELECT * FROM job_alert 
WHERE 
(alertIdVal IS NULL OR alert_id = jAlertId) 
    AND (timeFromVal IS NULL && timeToVal IS NULL 
    OR start_time BETWEEN timeFromVal AND timeToVal) 
    AND (secondsVal IS NULL 
    OR time_diff >= seconds) 
    AND (statusVal IS NULL 
    OR status = alertStatus) 
    AND (hostVal IS NULL OR host_name = jHostName) 
ORDER BY alert_id DESC 
LIMIT OFFSETVAL , FETCHVAL; 
END 

하는 필터가 예를 적용하지 않으면 내가 JSON으로 변환 한 후 모든 I 출력의이 종류를 기대하고 null로 설정됩니다

{ 
    error: "null", 
    jobStatus: "SUCCESS", 
    startTime: "Sep 9, 2016 10:42:54 AM", 
    endTime: "Sep 9, 2016 10:42:55 AM", 
    timeDiff: 1217, 
    runCount: 2, 
    jobInstanceId: 834, 
    host: "IT2561", 
    nextRun: "Sep 9, 2016 10:52:54 AM", 
    jobCount: 11, 
    name: "Gift Certificate Delivery", 
    id: 6, 
    description: "Gift Certificate Delivery" 
} 

내가 다른 StackOverflow의 답변을보고에서이를 작성했다 , 그래서 나는 내가 놓친 뭔가가 있다고 가정하고 있습니다. 내 콘솔에 오류가 발생하지 않고 기록을 반환하지 않습니다.

+0

일부 샘플 데이터와 일부 값을 전달하고 결과 집합을 예상하십시오. – Shaharyar

+0

사용자가 해당 필터를 선택하지 않으면 변수에 무엇을 전달합니까? – Shaharyar

+0

@Shaharyar 기본값은 내가 sp에 모든 null을 전달할 때 심지어 그것은 단지 null 일 것이라고 말하는 것이 더 쉬울 것이므로 작동하지 않습니다. json을 포함시켜 봤지만 당신이 정말로 포함시키고 자하는 것을 확신하지 못했습니다. – justBecca

답변

0

데이터를 수정하지 않고도 문제를 해결하기 위해 노력했습니다. 그것을 확인하고 무엇이 잘못되었는지 말해주십시오. 또한 변수를 제거 했으므로 변수가 필요하지 않습니다.

CREATE PROCEDURE `spFiltersGet`(
IN jAlertId int, IN timeFrom timestamp, IN timeTo timestamp, 
IN seconds int, IN alertStatus varchar(255), IN jHostName varchar(255)) 
BEGIN 

    DECLARE _fetchVal INT; 
    DECLARE _offsetVal INT; 

    SET _fetchVal = 10; 
    SET _offsetVal = 0; 

    SELECT 
     * 
    FROM 
     job_alert 
    WHERE 
     alert_id = IFNULL(jAlertId, alert_id) -- id 
     AND 
     ((timeFrom IS NULL AND timeTo IS NULL) OR start_time BETWEEN timeFrom AND timeTo) -- start time 
     AND 
     (seconds IS NULL OR `time_diff` >= seconds) -- min time difference 
     AND 
     (alertStatus IS NULL OR `status` = alertStatus) -- status 
     AND 
     (jHostName IS NULL OR `host_name` = jHostName) -- host name 
    ORDER BY 
     alert_id DESC 
    LIMIT 
     _offsetVal, _fetchVal; 
END 
관련 문제