我正在构建的搜索查询的一部分需要通过 SQL 查询处理过滤器值,以检查数据库字段中的 CSV 列表。 (我无法控制数据库字段中 CSV 列表的使用/不使用,使用我拥有的内容)并且我做了一些测试,发现您可以执行以下操作:
Where database_field In (#CSV_list#)
If database_field
等于2
and CSV_list
等于1,2,3,4
这会返回true
因为在 CSV 列表中找到了值 2。
但是,我遇到的问题是我需要根据字段检查值列表,而不是根据列表检查字段。我会告诉你我是如何做到这一点的。
<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>
现在,你们中的一些人可能会想“天哪,这是一种非常低效的做事方式。我知道,但我通过反复试验发现的一件事是,一旦我让一种方法发挥作用,我总是找到一种优化它的方法.对于我以前从未尝试过的事情,第一次就追求完美是没有意义的。无论如何,偏离切线,正如你所看到的,它循环了我的filterList
变量并检查每个值item_sizes
字段以查看该值是否在该 CSV 列表中。
这就是问题所在。如果item_sizes
等于2
,很好,因为其中一个值是2
它会匹配 true。然而如果item_sizes
等于2,3,4
,即使我的两个变量值是2
and 4
,它不匹配STRING of 2,3,4
(我发现通过反复试验发生的事情)。我的猜测是,即使我将值放在左侧并将字段放在右侧,它仍然以如下方式运行该行item_sizes In (#filter_item#)
,这是我能想到的唯一合乎逻辑的答案。
有谁知道我如何通过使用上面使用的方法来解决这个问题(无需规范化数据库,因为目前这是不可能的)?
SOLUTION
正如评论中引用的那样,我找到了解决此问题的临时解决方案。它不是最好的,但它确实有效。
通过使用以下语法,您可以获得所需的结果:
<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 变量中。