0

我希望代表用户在我的 SQL 查询中分隔 Crystal Reports 变量,以便他们可以提供格式为"customer1, customer2, customer 3"vs.的输入"'customer1', 'customer2', customer3'"REPLACE()通过将 Crystal Reports 参数传递给查询中的andCONCAT()函数,我可以代表用户格式化字符串。当我将代码放在选择列表中时,字符串会被适当地格式化以在IN表达式中使用。但是,一旦我将代码迁移到IN子句,查询就不会返回任何行。我已将选择列表中的输出复制并粘贴到IN语句中,并且按预期返回了行。我试图在我的 SQL 客户端中针对字符串文字而不是参数执行相同的代码,结果相同,这意味着这不是特定于 Crystal Reports。

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

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

我知道这种方法在性能方面并不理想。

SQL 驱动程序标准(SQL-92,通过 ODBC 的 1 级合规性) DB:Progress 32 位 db(带有 SQL 抽象层的 ABL Native) 应用程序:Epicor 9.05

4

1 回答 1

0

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

你也许可以采取不同的方式。如果您的数据库具有在LOCATE()字符串中搜索子字符串的功能或类似功能,那么您可能可以像这样编写过滤条件:

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

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

于 2015-09-04T20:33:27.713 回答