SQL Server: получить записи, которые соответствуют конкретным данным в определенном месте? - PullRequest
0 голосов
/ 28 августа 2011

У меня есть столбец varchar, в котором есть такие данные, как 00110100001110100100010011111, и мне нужно получить записи, которые имеют 1 в позиции 5 и 0 в позиции 11. Какой самый быстрый способ их поиска?

Сейчас я думаю об использовании подстроки: substring (column, 5, 1) == 1 и substring (column, 11,1) == 0.Это лучший способ?Спасибо.

Ответы [ 3 ]

1 голос
/ 28 августа 2011

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
0 голосов
/ 28 августа 2011

Позиции 5 и 11 остаются постоянными?У вас есть возможность создавать вычисляемые столбцы и индексы?

Если ответ на оба эти вопроса «да», то вы сможете добиться хорошей производительности, реализовав следующую общую идею:

  • Создать вычисляемый столбец на substring(column, 5, 1).
  • Создать вычисляемый столбец в substring(column, 11,1).
  • Создать составной индекс для обоих этих столбцов.

Затем в своем запросе просто используйтеточно такие же выражения, как в определениях ваших вычисляемых столбцов (таких как: substring(column, 5, 1)==1 and substring (column, 11,1)==0, как вы уже предложили).

При этом, если можете, сделайте себе одолжение и нормализуйте свою модель данных.Ваш стол даже не в 1-й нормальной форме!

0 голосов
/ 28 августа 2011

Используйте SUBSTRING. Вы можете параметризовать подстроку, так что если вы хотите, чтобы позиции 3 и 13 вы могли изменить ее или иметь в UDF и т.д.

Конечно, это зависит от того, что вы хотите

Если это статические позиции, используйте ответ Мартина Смита, потому что он чище

Я подозреваю, что вам нужно реорганизовать этот столбец в несколько отдельных, хотя

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