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
用逗号包围所有内容可确保您只匹配完整的字符串,并确保您可以匹配列表中的第一个和最后一个字符串。
我希望代表用户在我的 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
用逗号包围所有内容可确保您只匹配完整的字符串,并确保您可以匹配列表中的第一个和最后一个字符串。