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>

展開されたリストが正しく解釈されないため、誤ってqLeftoverFruit1 行が返されます。bananas, peaches and plumbscfqueryparam

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

cfqueryparamタグとをまだ使用している間にこれを修正する方法はありValueListますか?

更新この問題を再現するために使用できる要点は次のとおりです

4

2 に答える 2

5

@ダニエル・メンデル、問題は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

この質問には 2 つの例が示されています。CF から少し離れて、この作業を 1 つのクエリだけで行うことを検討してください。質問のクエリについて:

<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>

これらの単一クエリは、基本的に 2 つのクエリ アプローチのロジックを実行します。これにより、cfqueryparam を使用する必要がなくなり、潜在的に巨大なリストを処理し、「安全な」区切り文字を決定する際の落とし穴がなくなります。

ただし、このクエリが必要な理由はわかりません。常に空のクエリ (質問からのクエリ) またはすべてのレコード (github.com からのクエリ) を返す必要があります。元の質問で言及されていない 2 つのクエリ間の中間ステップはありますか?

于 2013-01-22T22:25:14.863 に答える