LIKE '____1_____0%'
- это самый простой способ с вашей текущей структурой. Это будет включать в себя полное сканирование таблицы, хотя из-за ведущего символа подстановки.
Что представляет собой эта строка символов?
Если это фиксированный набор логических значений, вы можете подумать о том, чтобы разделить их на отдельные битовые столбцы и индексировать их по отдельности.
Это более экономно, так как 8 значений могут уместиться в 2 байта (включая нулевое растровое изображение), в отличие от 2 значений в 2 байта для версии varchar
.
Вполне возможно, что сканирование таблиц может закончиться, поскольку эти индексы не будут достаточно избирательными для использования, за исключением случаев, когда значения искажены и вы ищете менее распространенные значения, но, по крайней мере, SQL Server сможет поддерживать отдельные Столбец статистики и используйте индексы, когда это поможет.
Если это произвольный набор (например, постоянно растущая история состояний), то вам, вероятно, следует выделить новую таблицу (EntityId
, Position (int)
, Value (bit)
). Затем вы можете использовать запрос реляционного деления, чтобы вернуть все EntityIds, соответствующие желаемому шаблону.
SELECT EntityId
WHERE ( Position = 5
AND Value = 1
)
OR ( Position = 11
AND Value = 0
)
GROUP BY EntityId
HAVING COUNT(*) = 2