私が構築している検索クエリの一部では、データベース フィールド内の CSV リストと照合するために、SQL クエリを介してフィルター値を処理する必要があります。(データベースフィールド内のCSVリストの使用/非使用を制御することはできず、私が持っているものを操作しています)、少しテストを行ったところ、次のことができることがわかりました:
Where database_field In (#CSV_list#)
database_field
等しい場合は2
、値 2 が CSV リスト内で見つかったため、これが返されます。CSV_list
1,2,3,4
true
ただし、私が抱えている問題は、リストに対するフィールドではなく、フィールドに対する値のリストをチェックする必要があることです。私がこれをどのように行ったかをお見せします。
<cfset URL.filter_sizes = [2,4,7,10]>
<cfif IsDefined("URL.filter_sizes")>
<cfset filterList = mid(URL.filter_sizes, 2, len(URL.filter_sizes) - 2)>
And (
<cfloop list="#filterList#" index="filter_item">
<cfqueryparam cfsqltype="cf_sql_varchar" value="#filter_item#"> In
(item_sizes)
<cfif listLast(filterList, ",") neq filter_item>
Or</cfif>
</cfloop>
)
</cfif>
さて、「なんてことだ、これは非常に非効率的な方法だ。わかっているが、試行錯誤を経てわかったことの 1 つは、メソッドが機能するようになると、常にそれを最適化する方法を見つけることだ」と思う人もいるかもしれません。 . 今までに試したことのないもので初めて完璧を目指す意味はありません. とにかく接線から外れて、ご覧のとおり、filterList
変数をループし、フィールドに対して各値をチェックしてitem_sizes
、値がそのCSVリストにあるかどうかを確認します.
これがキャッチです。item_sizes
equaledの場合、値の 1 つがtrue に一致2
するため、すばらしいことです。2
ただし、item_sizes
equaled2,3,4
の場合、変数の値の 2 つが2
とであっても、 STRINGと4
一致しません(試行錯誤によって見つかったことが起こります)。私の推測では、値を左側に、フィールドを右側に配置しても、行は として実行されます。これが、私が思いつくことができる唯一の論理的な答えです。2,3,4
item_sizes In (#filter_item#)
上記で使用した方法を使用して、この問題を解決する方法を知っている人はいますか (現時点ではデータベースを正規化することはできません)。
解決
コメントで引用されているように、この問題に対するその場しのぎの解決策を見つけました。それは最高ではありませんが、うまくいきます。
次の構文を使用すると、目的の結果を得ることができます。
<cfset URL.filter_sizes = [2,4,7,10]>
<cfif IsDefined("URL.filter_sizes")>
<cfset filterList = mid(URL.filter_sizes, 2, len(URL.filter_sizes) - 2)>
And (
<cfloop list="#filterList#" index="filter_item">
',' + item_sizes + ',' Like
<cfqueryparam cfsqltype="cf_sql_varchar" value="%,#filter_item#,%">
<cfif listLast(filterList, ",") neq filter_item> Or</cfif>
</cfloop>
)
</cfif>
ご注意ください
の使用は、<cfset URL.filter_sizes = [2,4,7,10]>
(編集後に) 実際の URL 変数がどうなるかをエミュレートすることです。struct
これは、URL 変数内で使用した間違いではありません。