【问题标题】:Appending conditions in where clause not working在 where 子句中附加条件不起作用
【发布时间】:2011-10-10 07:00:04
【问题描述】:

我正在尝试将条件附加到 where 子句。但包含条件的字符串不起作用。我没有收到任何错误,但条件未完全应用于查询

这是查询。我将 CLINIC_ID 和 taleEnd 传递给我的存储过程。taleEnd 将包含一个或更多类似的条件 - “和 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 ,设置但没有任何效果。我没有收到任何错误,但结果不适用于 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;

【问题讨论】:

  • 啊哈,我明白了您要执行的操作,即将其他过滤条件(包括字段名称)传递给您希望在执行期间应用于查询的过程。在这种情况下,恐怕我不确定该怎么做,但如果你得到答案,我会对答案感兴趣!!!
  • @Dave Rix 是的,你是绝对正确的..但我无法摆脱这个......:-(

标签: mysql sql concat


【解决方案1】:

同意 Dave Rix 关于变量和字段名称的观点,它们应该不同。

如果您想在查询中附加额外的字符串(例如 - 和 '2011-09-08' 和 '2011-10-08' 之间的 DOS),那么您应该使用 @987654321 @。

编辑:

例子:

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;

【讨论】:

  • 不,我也使用了准备好的语句。但它也不起作用。
  • 检查您的查询并添加taleEnd。它有效吗?单独执行。
  • 。不,taleEnd 是动态的。。可能有一个 taleEnd 条件,或者它可能以 Clinic_id 结尾。所以唯一的方法是将其附加到静态查询中。
  • 我知道 taleEnd 是动态的。它应该与准备好的语句一起使用。但是,首先 - 尝试使用 taleEnd 条件执行和测试您的查询并检查结果。
  • 感谢您的考虑。我已经单独执行了它并且它有效并给出了确切的结果。
【解决方案2】:

如果您将CLINIC_ID 传递给存储过程,并尝试在过程中使用它,我认为(无法正确检查)变量CLINIC_ID 和字段之间存在混淆VP.CLINIC_ID.

尝试将过程中的变量名称更改为唯一的名称。

【讨论】:

  • no 实际上,clinic_id 正在其他条件下工作,即 taleEnd 不正确。
  • 好的,我们需要查看完整的CREATE PROCEDURECREATE FUNCTION 语句,以及如何使用它也会很有用...
  • @Dave Rix 我已经添加了存储过程。这对你来说足够了吗。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2016-11-25
  • 2012-06-28
  • 2017-11-10
  • 2016-12-16
  • 2013-12-23
  • 2016-11-13
  • 2018-11-14
相关资源
最近更新 更多