如何在整数列上指定“Like”?

时间:2011-09-30 21:28:17

标签: sql sql-server-2008 nhibernate

这个让我难过,并且认为我会向SO社区提供帮助。

用户想要选择以特定ID开头的所有订单,例如:

123 将返回 123 12345 1238790 等。但ID是一个i​​nt列。< / p>

我正在使用nHibernate,我的线目前是:

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

但是这只会让我返回123.我可以做一个Restrictions.Like,但是转换为SQL LIKE子句,并且不能在int col上工作。

有什么想法吗?

编辑:抱歉,数据库是SQL Server 2008

5 个答案:

答案 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是一个i​​nt列   但是。

这听起来像(双关语)你的设计可能会遇到一些问题。

首先,尽管数据元素名称“订单号”可以表示数字,但是订单号等通常是非数字的(例如,固定宽度文本)。例如,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的转换,您无需更改数据库即可查询。