这个让我难过,并且认为我会向SO社区提供帮助。
用户想要选择以特定ID开头的所有订单,例如:
123 将返回 123 , 12345 , 1238790 等。但ID是一个int列。< / p>
我正在使用nHibernate,我的线目前是:
criteria.Add(Restrictions.Eq("Id", itemId));
但是这只会让我返回123.我可以做一个Restrictions.Like,但是转换为SQL LIKE子句,并且不能在int col上工作。
有什么想法吗?
编辑:抱歉,数据库是SQL Server 2008
答案 0 :(得分:3)
不幸的是,你没有指定你正在使用的是什么数据库(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%'
这是否真的具有商业意义,是一个完全不同的故事......(我同意Oded和Matt Ball ......)
但是因为现在这是一个字符串列,所以你应该可以在你提到的NHibernate中使用Restrictions.Like
方法。
答案 1 :(得分:2)
用户想要选择以特定ID开头的所有订单, 例如:
123将返回123,12345,1238790等.ID是一个int列 但是。
这听起来像(双关语)你的设计可能会遇到一些问题。
首先,尽管数据元素名称“订单号”可以表示数字,但是订单号等通常是非数字的(例如,固定宽度文本)。例如,International Standard Book Number (ISBN)是非数字的,尤其是因为最终字符可以是X
。即使所有允许的字符都是数字,也不一定表示值是数字。
要问自己一个好问题是,将数学运算应用于这些值是否有意义?例如,计算客户订单号的总和是否给出了意义结果?如果答案为否,则值可能不是数字。此外,根据要求,在值上使用LIKE
等运算符强烈表明它们确实是非数字的。
其次,值ID = '123'
与以相同字符开头的任何ID
之间似乎存在隐含关系。要返回ISBN示例,您可以通过将ISBN拆分为其复合组来确定同一发布者是否发布了两本不同的图书(取决于了解发布商的代码)。如果您的ID值具有相似的分组,并且您需要查询这些分组,您可能会发现将123
子元素与标识符的其余部分分开存储更容易,并将这些部分连接起来仅供显示。
答案 2 :(得分:1)
我不确切知道如何在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
答案 3 :(得分:0)
由于Linq(使用NHibernate)可以实现这一点,因此最有可能使用Criteria。您只需要在调用之前将其转换为字符串/ varchar。也许有一个“转换为字符串”投影?
在Linq,这只是:
.Where(x => x.Id.ToString().StartsWith("123"))
答案 4 :(得分:0)
在您的类映射中,您可以定义一个使用公式填充它的字符串列。使用公式完成从int到string的转换,您无需更改数据库即可查询。