我正在构建的搜索查询的一部分需要通过 SQL 查询处理过滤器值,以检查数据库字段中的 CSV 列表。(我无法控制数据库字段中 CSV 列表的使用/不使用,使用我所拥有的)并且我做了一些测试,发现您可以执行以下操作:
Where database_field In (#CSV_list#)
如果database_field
相等2
和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
equaled2
很好,因为其中一个值将是2
并且它会匹配 true。但是,如果item_sizes
equaled 2,3,4
,即使我的两个变量值是2
and 4
,它也不匹配STRING(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 变量中使用 a 的错误。