Номера для заказа, которые хранятся в виде строк в базе данных - PullRequest
1 голос
/ 17 октября 2008

У меня есть несколько записей в нескольких таблицах в базе данных, которые имеют поле «номер процесса», это в основном число, но я должен сохранить его как строку, так как некоторые устаревшие данные содержат такие вещи, как «89a "как система нумерации и нумерации, которая требует, чтобы номера процессов были представлены как число / год.

Проблема возникает, когда я пытаюсь упорядочить процессы по номеру. Я получаю такие вещи, как:

  • 1
  • 10
  • 11
  • 12

И другая проблема, когда мне нужно добавить новый процесс. Номер нового процесса должен быть наибольшим существующим номером, увеличенным на единицу, и для этого мне понадобится способ упорядочить существующие записи по номеру.

Есть предложения?

Ответы [ 8 ]

1 голос
/ 17 октября 2008

Предложение:

• Сделайте ваш столбец текста фиксированной ширины (т.е. CHAR вместо VARCHAR).

• Дополните существующие значения достаточным количеством начальных нулей, чтобы заполнить каждый столбец, и конечным пробелом, в котором значения не заканчиваются на «а» (или что-либо еще). • Добавьте ограничение CHECK (или его эквивалент), чтобы новые значения соответствовали шаблону, например, что-то вроде

CHECK (process_number LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][ab ]')

• В хранимых процедурах вставки / обновления (или аналогичных) добавьте все входящие значения, чтобы они соответствовали шаблону.

• Удалите начальные / конечные нули / пробелы соответствующим образом при отображении значений для людей.

Другое преимущество этого подхода состоит в том, что входящие значения «1», «01», «001» и т. Д. Будут рассматриваться как одно и то же значение и могут охватываться простым уникальным ограничением в СУБД. *

Кстати, мне нравится идея разделения конечного «а» (или чего-либо еще) на отдельный столбец, однако у меня сложилось впечатление, что рассматриваемый элемент данных является идентификатором, и, следовательно, нецелесообразно его разделять.

1 голос
/ 17 октября 2008

Учитывая, что ваши номера процессов не соответствуют каким-либо фиксированным шаблонам (из вашего вопроса и комментариев), вы можете создать / поддерживать таблицу номеров процессов, которая имеет два поля:

create table process_ordering ( processNumber varchar(N), processOrder int )

Затем выберите все номера процессов из ваших таблиц и вставьте их в таблицу номеров процессов. Установите порядок, который вы хотите, основываясь на (разных) форматах номеров процессов. Присоединитесь к этой таблице, упорядочите по processOrder и выберите все поля из другой таблицы. Индексируйте эту таблицу для processNumber, чтобы сделать соединение быстрым.

select my_processes.*
from my_processes
  inner join process_ordering on my_process.processNumber = process_ordering.processNumber
order by process_ordering.processOrder
1 голос
/ 17 октября 2008

Мне кажется, что у вас есть две задачи здесь.

& Бык; Преобразовать строки в числа по старому формату / убрать мусор
& bull; Заказать номера

Если у вас есть практический способ введения регулярных выражений при разборе строк в ваш процесс (и у вашей проблемы достаточно объема, чтобы стоить усилий), то я бы

& Бык; Создайте справочную таблицу, например

CREATE TABLE tblLegacyFormatRegularExpressionMaster(
    LegacyFormatId int,
    LegacyFormatName varchar(50),
    RegularExpression varchar(max)
)

& бык; Затем с помощью способа вызова регулярных выражений, таких как интеграция CLR в SQL Server 2005 и более поздних версиях (интеграция .NET Common Language Runtime, позволяющая вызывать скомпилированные методы .NET изнутри SQL Server как обычно (расширенная Microsoft ) T-SQL , тогда вы сможете решить свою проблему.

& bull; Смотри

http://www.codeproject.com/KB/string/SqlRegEx.aspx


Я извиняюсь, если это слишком много для вашей проблемы.

1 голос
/ 17 октября 2008

Можете ли вы разделить данные на два поля?

Сохраните «номер процесса» как int, а «подтип процесса» - как строку.

Таким образом:

  • вы можете легко получить MAX processNumber - и увеличивать его, когда вам нужно сгенерировать новый номер
  • Вы можете ЗАКАЗАТЬ ПО ПРОБЕЛУ АСК, processSubtype ASC - чтобы получить правильный порядок, даже если несколько записей имеют один и тот же базовый номер с добавлением разных лет / букв
  • когда вам нужен «полный» номер, который вы можно просто объединить два поля

Будет ли это делать то, что вам нужно?

1 голос
/ 17 октября 2008

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

1 голос
/ 17 октября 2008

Можете ли вы сохранить числа как дополненные нулями значения? То есть 01, 10, 11, 12?

1 голос
/ 17 октября 2008

Может быть, это поможет.

По существу:

SELECT process_order FROM your_table ORDER BY process_order + 0 ASC
0 голосов
/ 17 октября 2008

Вы должны разыграть свое поле, как вы выбираете. Я основываю этот синтаксис на MySQL - но идея та же:

select * from table order by cast(field AS UNSIGNED);

Конечно, неподписанный может быть подписан при необходимости.

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