使用实体框架订购混合字符串/数字列

问题描述 投票:0回答:2

在我的数据库中,我有一列可以仅包含数字或文本(也可以包含数字)。对于

char
列,SQL Server 按字符代码(1、12、14、2、20、200、3、30...)对值进行排序。

当它们是数字时,我该如何编写

.OrderBy
语句才能像数字一样对它们进行排序?

sql sql-server entity-framework sql-order-by
2个回答
1
投票

如果您想在数据库上排序(而不是在应用程序上),那么

使用

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 语句中。

演示


0
投票

这个 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();
© www.soinside.com 2019 - 2024. All rights reserved.