SQL WHERE IN 子句与嵌套函数比较时不返回任何行(Crystal 报告命令与 SQL-92 数据库)

SQL WHERE IN Clause Returning no Rows when comparing with nested functions (Crystal Reports Command with SQL-92 DB)

我希望代表用户在我的 SQL 查询中分隔 Crystal Reports 变量,以便他们能够以 "customer1, customer2, customer 3""'customer1', 'customer2', customer3'"。我可以代表用户格式化字符串,方法是将 Crystal Reports 参数传递给查询中的 REPLACE()CONCAT() 函数。当我将代码放在 select 列表中时,字符串被适当地格式化以用于 IN 表达式。但是,一旦我将代码迁移到 IN 子句,查询 returns 就没有行。我已将 select 列表的输出复制并粘贴到 IN 语句中,行按预期返回。我试图在我的 SQL 客户端中针对字符串文字而不是参数执行相同的代码,结果相同,这意味着这并非特定于 Crystal 报告。

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

代码只是将逗号替换为“,”,并在参数值的开头和结尾附加了一个单引号。在我的 select 列表中,代码 returns: 'customer1','customer2'.

我了解此方法在性能方面并不理想。

SQL 驱动程序标准(SQL-92,通过 ODBC 的 1 级合规性) DB: Progress 32-bit db (ABL Native with SQL Abstraction layer) 应用:Epicor 9.05

您的 CONCAT(...) 的结果是一个字符串。对于您要执行的操作,需要将其解释为 SQL 代码。那不会发生。

你或许可以换一种方式。如果您的数据库具有 LOCATE() 函数或类似的用于在字符串中搜索子字符串的函数,那么您也许可以像这样编写过滤条件:

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

用逗号包围所有内容可确保您只匹配完整的字符串,并确保您可以匹配列表中的第一个和最后一个字符串。