SQL WHERE IN子句与嵌套函数(使用SQL-92 DB的Crystal Reports命令)进行比较时返回no行

SQL WHERE IN子句与嵌套函数(使用SQL-92 DB的Crystal Reports命令)进行比较时返回no行

问题描述:

我正在代表用户在我的SQL查询中分隔一个Crystal Reports变量,以便它们可以提供输入格式"customer1, customer2, customer 3""'customer1', 'customer2', customer3'"。我可以通过将Crystal Reports参数传递给查询中的REPLACE()CONCAT()函数来代表用户格式化字符串。当我将代码放入选择列表中时,该字符串被格式化为适合在IN表达式中使用。但是,只要将代码迁移到IN子句,查询就不会返回任何行。我复制并将选择列表的输出粘贴到IN语句中,并按预期方式返回行。我试图在SQL客户端中针对字符串文字而不是参数执行相同的代码,结果相同,这意味着这不是特定于Crystal Reports的。SQL WHERE IN子句与嵌套函数(使用SQL-92 DB的Crystal Reports命令)进行比较时返回no行

select 
    customer.custid, 
    customer.name 
from pub.customer 
where customer.custid IN (
    CONCAT('''', CONCAT(RTRIM(LTRIM(
    REPLACE('{?customer_param}', ',', ''','''))), ''''))) 

该代码只是用','替换逗号,并在参数值的开始和结尾附加单引号。在我的选择列表中,代码返回:'customer1','customer2'。

我明白这种方法在性能方面并不理想。

SQL驱动程序标准(SQL-92,第1级通过ODBC遵循) DB:进度32位分贝(ABL天然的SQL抽象层) 应用:的Epicor 9.05

CONCAT(...)的结果是一个串。对于你要做的工作,它需要被解释为SQL代码。这不会发生。

你也许可以用不同的方式来解决它。如果你的数据库有LOCATE()功能或一个字符串中寻找一个子串类似的东西,那么你也许可以写你的过滤条件,像这样:

WHERE LOCATE(
    CONCAT(',', customer.custid,  ','), 
    CONCAT(',', '{?customer_param}', ',')) != 0 

拍逗号周围的一切,确保您只匹配完整的字符串,并确保您可以匹配列表中的第一个和最后一个字符串。

+0

谢谢你的聪明的解决方案。由于Progress SQL-92标准驱动程序在其CONCAT()函数中仅支持两个参数,因此我最终部署了此建议的再现。 (',',','))!!= 0''(',',')', –