3

假设有一个 SQL 表Fruit

id | name
--- ------
 1 | 'apples'
 2 | 'pears'
 3 | 'kiwi'
 4 | 'bananas, peaches and plumbs'

鉴于以下查询

<cfquery name="qAllFruit" datasource="#DSN#">
    SELECT name FROM Fruit
</cfquery>
<cfquery name="qLeftoverFruit" datasource="#DSN#">
    SELECT name FROM Fruit
     WHERE name NOT IN (<cfqueryparam CF_SQL_TYPE="CF_SQL_VARCHAR" 
                                      value="#ValueList(qAllFruit.name)#" 
                                      list="yes" />)
</cfquery>

thenqLeftoverFruit将错误地返回 1 行:bananas, peaches and plumbs因为扩展cfqueryparam列表的解释不正确:

WHERE name NOT IN ('apples','pears','kiwi','bananas','peaches and plumbs')

有没有办法在仍然使用cfqueryparam标签的同时纠正这个问题ValueList

更新这里有一个要点可以用来重新创建这个问题: http: //gist.github.com/a642878c96b82b21b52c

4

2 回答 2

5

@Daniel Mendel,我认为问题出在 ColdFusion 使用的默认分隔符上。您的数据中包含“,”,而 CF 中的默认分隔符是“,”。

像这样更改您的查询 -

WHERE name NOT IN ( <cfqueryparam CFSQLType="CF_SQL_VARCHAR" 
                       value="#ValueList(qTags.tag,';' )#" 
                       list="Yes" separator=";" />
                  )

只需将 valueList 中的分隔符更改为 ';' 从默认的 ',' 并将 QueryParam 分隔符设置为 ';'。

于 2013-01-22T03:08:21.297 回答
0

这个问题提供了两个例子。从 CF 退后一步,考虑在一个查询中单独完成这项工作。对于问题中的查询:

<cfquery name="qLeftoverFruit" datasource="#DSN#">
SELECT name FROM Fruit
WHERE name NOT IN (SELECT name FROM Fruit)
</cfquery>

使用来自 github.com 的示例:

<cfquery name="qTest" dbtype="query">
SELECT id FROM qTags
WHERE tag IN (SELECT tag FROM qTags)
</cfquery>

这些单个查询本质上执行了两个查询方法的逻辑。它消除了使用 cfqueryparam、处理潜在的巨大列表以及确定“安全”分隔符的陷阱的需要。

但是,我不确定为什么需要此查询。它应该始终返回一个空查询(来自问题的查询)或所有记录(来自 github.com 的查询)。原始问题中未提及的两个查询之间是否存在中间步骤?

于 2013-01-22T22:25:14.863 回答