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
拍逗号周围的一切,确保您只匹配完整的字符串,并确保您可以匹配列表中的第一个和最后一个字符串。
谢谢你的聪明的解决方案。由于Progress SQL-92标准驱动程序在其CONCAT()函数中仅支持两个参数,因此我最终部署了此建议的再现。 (',',','))!!= 0''(',',')', –