在过滤器的where子句中匹配多行

Posted

技术标签:

【中文标题】在过滤器的where子句中匹配多行【英文标题】:Matching multiple rows in where clause for filter 【发布时间】:2021-09-27 01:56:00 【问题描述】:

我有两张表如下:

Table 1 : Product_Information 
Information_ID Product_Name
1 A
2 B
3 C
4 D
5 E
Table 2 : Discriptor_Values 
Information_ID Descriptor_ID Descriptor_Value
1 1 98
1 2 142
1 3 29.66
2 1 50
2 2 11
2 3 14
3 1 17
3 2 76
3 3 85
4 1 59
4 2 48
4 3 35
5 1 48
5 2 12
5 3 19

使用上面的表格,我正在创建一个过滤器页面,就像在任何在线购物页面中一样,即手机的最小和最大价格范围,内部存储的最小和最大范围是描述符和值范围。 同样,我将选择描述符并为其提供最小值和最大值,匹配的产品将是结果。 如果我通过任何过滤范围,则将显示过滤后的产品列表,否则应显示所有记录。

我正在尝试以下查询,但没有得到正确的输出。我得到了与任何传递的行(#tblFilter)匹配的行的联合。

CREATE TABLE  #tblFilter(
    [descriptor_id] [int] NULL,
    [min_value] [decimal](18, 0) NULL,
    [max_value] [decimal](18, 0) NULL
)

insert into #tblFilter values (1, 40.33, 70.33)
insert into #tblFilter values (2, 100.33, 150.33)
insert into #tblFilter values (3, 10, 60)


    select p.*
        from Product_Information p
            inner join Discriptor_Values dv on p.Information_ID = dv.Information_ID
            left join #tblFilter t1 on t1.descriptor_id = dv.Descriptor_id
        WHERE ((dv.Descriptor_ID = t1.descriptor_id
            and convert(decimal, dv.Descriptor_Value)
                between CONVERT(decimal, t1.min_value) and CONVERT(decimal, t1.max_value))
       or not exists (select 1 from #tblFilter))


drop TABLE  #tblFilter  

请帮助我通过过滤器最小化结果列表,如果过滤器表(#tblFilter)中没有行,则显示所有记录。

【问题讨论】:

这能回答你的问题吗? Left Outer Join Not Working? @Charlieface 不,这个链接对我没有帮助。 【参考方案1】:

我相信你想要:

select p.*
from Product_Information p join
     Discriptor_Values dv
     on p.Information_ID = dv.Information_ID left join
     #tblFilter t1
     on t1.descriptor_id = dv.Descriptor_id
where dv.Descriptor_Value between t1.min_value and t1.max_value or
      dv.Descriptor_id is null;

我删除了对decimals 的转换。您可能实际上需要它们,但在问题中值看起来像数字,并且问题没有指定它们存储为字符串。

【讨论】:

我已经尝试过您的解决方案。它将所有记录作为输出。 @BholuBhaiya 。 . .您确定您使用的是正确的on 子句吗?

以上是关于在过滤器的where子句中匹配多行的主要内容,如果未能解决你的问题,请参考以下文章

SQL学习04——过滤数据

6.过滤数据

mysql过滤数据-------------------------待补充

postgres:是不是按返回顺序应用 where 子句过滤器

Where子句Mysql中的逗号分隔字符串参数过滤器

SQL 更改 where 子句中的过滤器数量