2

我正在构建的搜索查询的一部分需要通过 SQL 查询处理过滤器值,以检查数据库字段中的 CSV 列表。(我无法控制数据库字段中 CSV 列表的使用/不使用,使用我所拥有的)并且我做了一些测试,发现您可以执行以下操作:

Where database_field In (#CSV_list#)

如果database_field相等2CSV_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_sizesequaled2很好,因为其中一个值将是2并且它会匹配 true。但是,如果item_sizesequaled 2,3,4,即使我的两个变量值是2and 4,它也不匹配STRING2,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 的错误。

4

0 回答 0