Как указать «Мне нравится» в целочисленном столбце? - PullRequest
3 голосов
/ 01 октября 2011

На этот раз я поставил в тупик и подумал, что я передам его SO-сообществу за помощью.

Пользователь хочет выбрать все заказы, которые начинаются с определенного идентификатора, например:

123 вернет 123 , 12345 , 1238790 и т. Д. Однако ID является столбцом типа int.

Я использую nHibernate, и моя строка в настоящее время:

criteria.Add(Restrictions.Eq("Id", itemId));

но это только вернет меня 123. Я могу сделать Restrictions.Like, но это преобразуется в предложение SQL LIKE, и это не сработает для int col.

Есть идеи?

РЕДАКТИРОВАТЬ: Извините, DB является SQL Server 2008

Ответы [ 5 ]

3 голосов
/ 01 октября 2011

К сожалению, вы не указали какую базу данных вы используете (SQL - это просто язык запросов ....), но если вы используете SQL Server (продукт Microsoft RDBMS), затем вы можете создать вычисляемый столбец типа VARCHAR(15) для хранения строкового представления вашего INT, а затем просто выполнить поиск по нему ....

ALTER TABLE dbo.YourTable
   ADD IdAsString AS CAST(Id AS VARCHAR(15)) PERSISTED    -- PERSISTED might not work - depending on your version of SQL Server

SELECT (list of columns)
FROM dbo.YourTable
WHERE IdAsString LIKE '123%'

Действительно ли это имеет смысл для бизнеса, это совсем другая история ..... (Я согласен с Одедом и Мэттом Боллом ...)

Но поскольку теперь это строковый столбец, вы должны иметь возможность использовать свой подход Restrictions.Like в NHibernate, как вы упомянули.

2 голосов
/ 03 октября 2011

Пользователь хочет выбрать все ордера, которые начинаются с определенного идентификатора, например:

123 вернет 123, 12345, 1238790 и т. Д. Однако ID является столбцом типа int.

Похоже, что (каламбур) у вас может быть несколько проблем с вашим дизайном.

Во-первых, хотя имя элемента данных "номер заказа" может предлагать цифры, номера заказов и т. П.обычно не числовые (например, текст с фиксированной шириной).Например, Международный стандартный номер книги (ISBN) не является числовым, не в последнюю очередь потому, что последний символ может быть X.Даже если все допустимые символы являются цифрами, это не обязательно означает, что значения являются числовыми.

Хороший вопрос, который нужно задать себе: есть ли смысл применять математические операции к этим значениям?Например, дает ли вычисление суммы номеров заказов клиента значимый результат?Если ответ «нет», то значения, вероятно, не являются числовыми.Кроме того, учитывая требование использовать оператор, такой как LIKE, для значений является убедительным признаком того, что они действительно не являются числовыми.

Во-вторых, между значением ID = '123' илюбой ID, начинающийся с тех же символов.Чтобы вернуться к примеру ISBN, вы можете определить, были ли две разные книги опубликованы одним и тем же издателем (при условии знания кодов издателя), разбив ISBN на составные группы.Если значения вашего идентификатора имеют схожие группировки, и вам нужно выполнить запрос к этим группам, вам может оказаться проще хранить подэлемент 123 отдельно от остальной части идентификатора и объединять части только для отображения.

1 голос
/ 01 октября 2011

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

Версии SQL похожи на это

With cte as (
select top 10000000 row_number() over(order by t1.number) as N
from   master..spt_values t1 
       cross join master..spt_values t2)
SELECT * FROM cte
WHERE
n = 123
or n between  1230 and 1239
or n between  12300 and 12399
or n between  123000 and 123999
or n between  1230000 and 1239999
0 голосов
/ 12 октября 2011

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

0 голосов
/ 03 октября 2011

Так как это возможно в Linq (с NHibernate), это, скорее всего, также возможно с Criteria. Вам просто нужно преобразовать его в строку / varchar перед вызовом подобное. Может быть, есть проекция "конвертировать в строку"?

В Linq это будет просто:

.Where(x => x.Id.ToString().StartsWith("123"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...