7.1 <7.10 - номера для заказа - PullRequest
       13

7.1 <7.10 - номера для заказа

0 голосов
/ 16 ноября 2009

Есть ли способ хранить числа в БД, чтобы 7.1 был меньше, чем 7.10, то есть сохранить 2 балла? В настоящее время числа хранятся в виде чисел с плавающей запятой - мне нужно изменить на мелкие деньги, десятичные или что-то еще? Любые намеки на помощь приветствуются.

В настоящее время объект .Net использует столбец Double, а сервер SQL - это число с плавающей запятой.

Ответы [ 7 ]

3 голосов
/ 16 ноября 2009

Скорее всего, вам придется найти другой способ хранения и сравнения двух чисел, поскольку 7.1 и 7.10 равны, если говорить только о числах. Возможно, вам придется использовать поле varchar, а затем создать функцию, которая сравнивает два значения.

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

2 голосов
/ 16 ноября 2009

Вы хотите, чтобы 7.2 тоже было меньше 7.10? Как с некоторыми схемами управления версиями?

Если это так, сохраните номер версии в виде двух целочисленных полей. Для сравнения вы можете сравнивать каждое отдельно или использовать (слева * 1000 + справа) или аналогично.

1 голос
/ 16 ноября 2009

сохраните его как строку, так что эти два числа отличаются друг от друга.

0 голосов
/ 16 ноября 2009

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

Таким образом, вы получаете все преимущества встроенного класса (сравнения и т. Д.), И когда вам необходимо сохранить их в базе данных, вызовите Version.ToString (), чтобы получить результат в виде строки. Это может быть легко сохранено как поле varchar.

Чтобы получить ранее сохраненную версию из базы данных, извлеките поле varchar, а затем передайте его как строковый параметр конструктору класса Version.

Вы также можете использовать свойства Version.Major, Version.Minor для хранения и извлечения значений в отдельных целочисленных полях базы данных, если хотите.

0 голосов
/ 16 ноября 2009

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

CREATE TABLE Versions (
 version VARCHAR(10) PRIMARY KEY,
 ordinal INT NOT NULL
);

INSERT INTO Versions ('7.1', 1);
INSERT INTO Versions ('7.10', 2);

Сделайте вашу таблицу ссылкой Versions с внешним ключом:

CREATE TABLE MyTable (
 . . .
 version VARCHAR(10) NOT NULL,
 FOREIGN KEY (version) REFERENCES Versions(version)
);

Теперь вы можете присоединиться к этой таблице и отсортировать по порядковому номеру:

SELECT m.*
FROM MyTable m
JOIN Versions v USING (version)
ORDER BY v.ordinal;

Для еще большей гибкости сделайте ordinal a FLOAT, чтобы вы могли добавлять новые записи между существующими записями без нумерации их всех.

0 голосов
/ 16 ноября 2009

Я бы использовал два целочисленных столбца. Первый будет содержать левую часть числа (7.1 => 7), а другой будет содержать правую часть (7.1 => 1). Я получал бы значение 7.1 всякий раз, когда я запрашиваю базу данных, преобразовывая значения столбцов в строку и добавляя их. Затем вы можете использовать отдельные значения столбца для сортировки.

Идея состоит в том, что у вас будет такой запрос: (извините, я не знаю, как конвертировать типы в запросе с моей головы):

Select string(col1) + string(col2)
from table
orderby col1, col2
0 голосов
/ 16 ноября 2009

Если вы выберете числовой тип данных, разницы между 7.1 и 7.10 не будет вообще.

В этом случае я бы на самом деле разделил столбец на две части: целую и десятичную.

Таким образом, 7.1 будет храниться как 7 и 1, 7.10 будет храниться как 7 и 10.

Если бы это было простое число из двух (основных / второстепенных), оно бы работало достаточно хорошо, я думаю

Ваш запрос становится:

select major|'.'|minor, other_fields
from tbl
order by major, minor.

Для номера, состоящего из нескольких частей (например, заголовки глав, 3.1.4.5.9 и т. Д.), Я бы все же разделил его, но, вероятно, использовал бы отдельную таблицу для хранения компонентов.

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