Несколько лет назад я работал над системой, в которой числовой первичный ключ хранился в столбце varchar [SQL Server], поэтому я быстро отклеился при запросе с помощью между оператором:Проблемы с хранением числовых данных в текстовых столбцах - SELECT ... 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: Спасибо за все ответы. Я не уверен, разочарован ли я, что нет очевидного и сложного решения, но я, соответственно, рад, что я не вижу ничего очевидного!
Я думаю, что я по-прежнему предпочитаю собственное решение; это просто, и это работает - есть ли причина, почему я не должен ее использовать? Я не могу поверить, что это много, если вообще возможно, менее эффективно, чем другие предлагаемые решения.
Я понимаю, что в идеальном мире эта проблема не будет существовать; но, к сожалению, я не работаю в идеальном мире, и часто это случай, когда вы делаете лучшее из плохой ситуации.
Я не использовал Oracle через год или около того, но если вы получаете ошибки преобразования при кастинге, вы не получите их, если в вашем заявлении указано неявное преобразование? – 2008-12-10 17:40:49
LENGTH - это функция, предназначенная для работы с строками, поэтому нет. – 2008-12-12 15:13:49