Несколько лет назад я работал в системе, в которой числовой первичный ключ хранился в столбце [SQL Server] varchar, поэтому я быстро оторвался при запросе с оператором BETWEEN:
SELECT ID FROM MyTable WHERE ID BETWEEN 100 AND 110;
Результаты:
100
102
103
109
110
11
Это был просто плохой дизайн. Тем не менее, я работаю над сторонней ERP-системой, которая, как вы можете себе представить, должна быть универсальной и гибкой; таким образом, у нас есть различные таблицы, в которых предусмотрены буквенно-цифровые поля, в которых бизнес использует только цифры - поэтому могут возникнуть похожие проблемы.
Я предполагаю, что это достаточно распространенная проблема; У меня есть достаточно простое решение, но мне любопытно, как другие решают такие проблемы.
Мое простое решение:
SELECT ID FROM MyTable
WHERE ID BETWEEN iStartValue AND iEndValue
AND (LENGTH(ID) = LENGTH(iStartValue)
OR LENGTH(ID) = LENGTH(iEndValue));
Как вы, возможно, можете сказать, это система Oracle, но я обычно работаю в SQL Server - так что, возможно, предпочтительны решения, независимые от базы данных.
Редактировать 1: Поцарапайте это - я не понимаю, почему проприетарные решения также не приветствуются.
Редактировать 2: Спасибо за все ответы. Я не уверен, разочарован ли я, что нет очевидного, изощренного решения, но, соответственно, я рад, что, похоже, я ничего не упустил!
Я думаю, что я все еще предпочитаю свое собственное решение; это просто и работает - есть ли причина, почему я не должен использовать это? Я не могу поверить, что это намного, если таковые имеются, менее эффективно, чем другие решения.
Я понимаю, что в идеальном мире эта проблема не существовала бы; но, к сожалению, я не работаю в идеальном мире, и часто это случай, когда можно извлечь выгоду из плохой ситуации.