Во-первых, вы хотите быть уверены, что типы совместимы. По всей вероятности, эти значения являются числами, поэтому отбросьте кавычки:
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, логика может быть настроена для этого.