首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SELECT查询检查具有单个值的多个列

问使用SELECT查询检查具有单个值的多个列
EN

Stack Overflow用户
提问于 2019-10-14 16:07:08
回答 1查看 39关注 0票数 0

我有一桌水果。现在在UI中,我为搜索条件提供了一个单独的字段。使用这个单一的搜索条件,我想在水果表的多个列中进行搜索。

考虑水果表包含列ID、Desc、Price、Quant、Stock。在这里,Price、Quant是整数,Stock是varchar。

我尝试了以下返回结果的查询,但我担心性能问题。

假设用户在UI中提供的字段中输入2并单击搜索,则查询将如下所示

代码语言:javascript
复制
select ID, Desc, Price, Quant, Stock 
from Fruits 
where Price = '2' 
or Quant = '2' 
or stock = '2' 

这是搜索同一个表的多列的正确方法吗?也会对性能有影响吗?

EN

回答 1

Stack Overflow用户

发布于 2019-10-14 19:25:09

首先,您需要确保这些类型是兼容的。这些值很可能是数字,所以去掉引号:

代码语言:javascript
复制
select ID, Desc, Price, Quant, Stock 
from Fruits f
where Price = 2 or Quant = 2 or stock = 2; 

这可以更简单地写成:

代码语言:javascript
复制
select ID, Desc, Price, Quant, Stock 
from Fruits f
where 2 in (Price, Quant, Stock); 

但这不会对性能有所帮助。

在大多数数据库中,查询将需要全表扫描--尽管有些数据库支持一种称为跳过扫描的特殊类型的索引扫描,这可能会有所帮助。

我认为解决这个问题的唯一方法是在每一列上有一个单独的索引:

代码语言:javascript
复制
create index idx_fruits_price on fruits(price);
create index idx_fruits_quant on fruits(quant, price);
create index idx_fruits_stock on fruits(stock, quant, price);

(您将了解为什么额外的列很有帮助。)

然后使用union all

代码语言:javascript
复制
select ID, Desc, Price, Quant, Stock 
from Fruits f
where Price = 2
union all
select ID, Desc, Price, Quant, Stock 
from Fruits f
where quant = 2 and price <> 2
union all
select ID, Desc, Price, Quant, Stock 
from Fruits f
where stock = 2 and price <> 2 and stock <> 2;

每个子查询都可以使用其中一个索引。由于不等式的存在,结果是排他的--假设列值不是null。如果允许使用null,则可以调整逻辑以处理此问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58372509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档