在我的数据库中,我有一列可以仅包含数字或文本(也可以包含数字)。对于
char
列,SQL Server 按字符代码(1、12、14、2、20、200、3、30...)对值进行排序。
当它们是数字时,我该如何编写
.OrderBy
语句才能像数字一样对它们进行排序?
如果您想在数据库上排序(而不是在应用程序上),那么
使用
patindex()
和 substring()
函数提取列的整数部分(将空情况视为零),然后转换为整数:
Order By cast( coalesce(
substring(yourCol, patindex('%[0-9]%', yourCol),
patindex('%[0-9][^0-9]%', yourCol + 't')
- patindex('%[0-9]%', yourCol) + 1)
,0) as int )
在您的 select 语句中。
这个 SQL 怎么样:
SELECT MyStringField,
(CASE WHEN ISNUMERIC(MyStringField) = 1 THEN Cast(MyStringColumn as int) ELSE 999999999 END) MyNumericField
FROM MyEntity
ORDER BY MyNumericField, MyStringField
另请参阅: 如何对 SQL Server 中包含数字的 VARCHAR 列进行排序?
我使用了以下 C# 代码片段来实现此行为:
数据上下文:
modelBuilder.Entity<MyEntity>().Property(s => s.MyNumericField).HasComputedColumnSql("CASE WHEN ISNUMERIC([MyStringField]) = 1 THEN Cast([MyStringField] as int) ELSE 9999999999999 END");
我的实体:
public class MyEntity
{
//...
[Required]
public string MyStringField
{
get;
set;
}
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public decimal MyNumericField
{
get;
set;
}
//...
}
Linq 查询:
var result = await query.OrderBy(x => x.MyNumericField).ThenBy(x => x.MyStringField).ToListAsync();