Проверьте наличие нескольких столбцов с одним значением с помощью запроса SELECT - PullRequest
0 голосов
/ 14 октября 2019

У меня есть стол фруктов. Теперь в пользовательском интерфейсе я предоставляю одно поле для критериев поиска. Используя этот единственный критерий поиска, я хочу искать в нескольких столбцах таблицы фруктов.

Рассмотрим таблицу фруктов, содержащую столбцы ID, Desc, Price, Quant, Stock. Здесь Price, Quant - целые числа, а Stock - varchar.

Я пробовал следующий запрос, который возвращает результаты, но я беспокоюсь о производительности.

Предположим, что пользователь вводит 2 вполе предоставляется в пользовательском интерфейсе и щелкает по поиску, тогда запрос будет выглядеть так, как показано ниже

select ID, Desc, Price, Quant, Stock 
from Fruits 
where Price = '2' 
or Quant = '2' 
or stock = '2' 

Это правильный способ поиска нескольких столбцов в одной таблице? И будет ли какое-либо влияние на производительность?

1 Ответ

0 голосов
/ 14 октября 2019

Во-первых, вы хотите быть уверены, что типы совместимы. По всей вероятности, эти значения являются числами, поэтому отбросьте кавычки:

select ID, Desc, Price, Quant, Stock 
from Fruits f
where Price = 2 or Quant = 2 or stock = 2; 

Проще говоря, это можно записать как:

select ID, Desc, Price, Quant, Stock 
from Fruits f
where 2 in (Price, Quant, Stock); 

, но это не повлияет на производительность.

В большинстве баз данных ваш запрос потребует полного сканирования таблицы - хотя некоторые базы данных поддерживают определенный тип сканирования индекса, который может помочь при сканировании с пропуском.

Единственный способ обойти это -иметь отдельный индекс для каждого столбца:

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:

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 s, логика может быть настроена для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...