Дополнительные условия, в которых пункт не работает - PullRequest
0 голосов
/ 10 октября 2011

Я пытаюсь добавить условие к условию where. Но строка, содержащая условие, не работает. Я не получаю никакой ошибки, но условие не применяется полностью в запросе

Вот запрос.Я передаю CLINIC_ID и taleEnd в мою хранимую процедуру. В файле tagEnd будет условие или что-то вроде этого - "и DOS между" 2011-09-08 "и" 2011-10-08 ""

SELECT *
  FROM A
  JOIN B ON C.CLINIC_ID = VP.CLINIC_ID AND C.CLAIM_ID = VP.CLAIM_ID
  JOIN C ON P.CLINIC_ID = VP.CLINIC_ID  AND P.PATIENT_ID = VP.PATIENT_ID
  JOIN D ON I.CLINIC_ID = C.CLINIC_ID  AND I.INSURANCE_ID= C.PRIMARY_INSURANCE_ID
  JOIN E ON B.CLINIC_ID = I.CLINIC_ID  AND B.BUSINESS_ID= I.COMPANY_ID
 WHERE (VP.STATUS = 3 OR VP.STATUS = 5)
   AND VP.PRIMARY_PAID = 0
   AND VP.PRIMARY_PENDING > 0
   AND C.PRIMARY_PAYER_ID > 0
   AND C.HIDEN = 0
   AND VP.CLINIC_ID = CLINIC_ID + taleEnd

Проблема в том, что при запуске хранимой процедуры применяется только clinic_id, а не DOS. Я попытался выполнить concat, set, но ничего не получилось. У меня не было ошибок, но результат не относится к DOS. Может кто-нибудь помочь мне, пожалуйста.

@ Devart Это процедура хранения.

CREATE DEFINER=`root`@`%` PROCEDURE `PRIMARY_INSURANCE_AGING`(CLINIC_ID INT,taleEnd TEXT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS PRIMARY_TEMP;
CREATE TEMPORARY TABLE PRIMARY_TEMP
SELECT *     
  FROM A   
  JOIN B ON C.CLINIC_ID = VP.CLINIC_ID AND C.CLAIM_ID = VP.CLAIM_ID   
  JOIN C ON P.CLINIC_ID = VP.CLINIC_ID AND P.PATIENT_ID = VP.PATIENT_ID   
  JOIN D ON I.CLINIC_ID = C.CLINIC_ID  AND I.INSURANCE_ID= C.PRIMARY_INSURANCE_ID   
  JOIN E ON B.CLINIC_ID = I.CLINIC_ID  AND B.BUSINESS_ID= I.COMPANY_ID 
 WHERE (VP.STATUS = 3 OR VP.STATUS =5 ) 
   AND VP.PRIMARY_PAID = 0   
   AND VP.PRIMARY_PENDING > 0   
   AND C.PRIMARY_PAYER_ID > 0   
   AND C.HIDEN = 0  
   AND VP.CLINIC_ID = CLINIC_ID + taleEnd;

   END

Это использование оператора Prepare

SET @A = CONCAT(34847," and DOS between '2011-09-08' and '2011-10-08'");
PREPARE STMT FROM '
SELECT *
  FROM A
  JOIN B ON C.CLINIC_ID = VP.CLINIC_ID AND C.CLAIM_ID = VP.CLAIM_ID
  JOIN C ON P.CLINIC_ID = VP.CLINIC_ID AND P.PATIENT_ID = VP.PATIENT_ID
  JOIN D ON I.CLINIC_ID = C.CLINIC_ID AND I.INSURANCE_ID= C.PRIMARY_INSURANCE_ID
  JOIN E ON B.CLINIC_ID = I.CLINIC_ID AND B.BUSINESS_ID= I.COMPANY_ID
  WHERE (VP.STATUS = 3 OR VP.STATUS = 5)
  AND VP.PRIMARY_PAID = 0
  AND VP.PRIMARY_PENDING > 0
  AND C.PRIMARY_PAYER_ID > 0
  AND C.HIDEN = 0
  AND VP.CLINIC_ID ? ';

EXECUTE STMT USING @A;

Ответы [ 2 ]

0 голосов
/ 10 октября 2011

Согласитесь с Дейвом Риксом в отношении имен переменных и полей, они должны отличаться.

Если вы хотите добавить дополнительную строку (например, - и DOS между '2011-09-08' и '2011-10-08 ') к запросу, тогда вы должны использовать подготовленный оператор .

РЕДАКТИРОВАТЬ:

Пример:

SET @query = 'SELECT *
FROM A
JOIN B ON C.CLINIC_ID = VP.CLINIC_ID AND C.CLAIM_ID = VP.CLAIM_ID
JOIN C ON P.CLINIC_ID = VP.CLINIC_ID AND P.PATIENT_ID = VP.PATIENT_ID
JOIN D ON I.CLINIC_ID = C.CLINIC_ID AND I.INSURANCE_ID= C.PRIMARY_INSURANCE_ID
JOIN E ON B.CLINIC_ID = I.CLINIC_ID AND B.BUSINESS_ID= I.COMPANY_ID WHERE (VP.STATUS = 3 OR VP.STATUS =5 ) AND VP.PRIMARY_PAID = 0
AND VP.PRIMARY_PENDING > 0
AND C.PRIMARY_PAYER_ID > 0
AND C.HIDEN = 0
AND VP.CLINIC_ID = ?'; -- ? will be supplied with procedure argument clinic_id_value; where clinic_id_value is a renamed procedure argument

IF taleEnd IS NOT NULL THEN
  @query = CONCAT(@query, ' ', taleEnd);
END IF;

SET @clinic_id_value = clinic_id_value; -- copy procedure argument to the local variable
PREPARE STMT FROM @query;
EXECUTE STMT USING @clinic_id_value;
DEALLOCATE PREPARE STMT;
0 голосов
/ 10 октября 2011

Если вы передаете CLINIC_ID хранимой процедуре и пытаетесь использовать ее в процедуре, я думаю (не имея возможности правильно проверить), что существует путаница между переменной CLINIC_ID и полем VP.CLINIC_ID.

Попробуйте изменить имя переменной в процедуре на что-то уникальное.

...