【问题标题】:SQL Order by DESC on alphanumeric field with numbers before wordsSQL Order by DESC 在字母数字字段上,单词前有数字
【发布时间】:2015-11-30 08:39:48
【问题描述】:

我在一个 SQL 表中有一个列,我正在尝试按 on 进行排序。数据需要采用 desc 格式,以便首先显示最近几年。

Sample Data         Expect Output
-----------         -------------
older                   2013
2012                    2012
2013                    2011
2011                    older

使用这种特殊方法,我只能访问 Order byWHERE 子句,而不是完整的 SQL。

这限制了我从 2 组中提取数据并加入。 我也无法将older 字段操作为999order 之类的内容,然后再将999 删除。

有没有一种方法可以让我得到我想要的东西?

【问题讨论】:

标签: mysql sql sql-server select kentico


【解决方案1】:

您可以在ORDER BY 子句中使用CASE 语句:

WITH tbl AS(
    SELECT 'older' AS date_col UNION ALL
    SELECT '2012' UNION ALL
    SELECT '2013' UNION ALL
    SELECT '2011'
)
SELECT * 
FROM tbl
ORDER BY
    CASE
        WHEN date_col NOT LIKE '%[^0-9]%' THEN 0
        ELSE 1
    END,
    date_col DESC

NOT LIKE '%[^0-9]%' 表示date_col 由所有数字组成。将0 分配给这些行,因为它们将在排序中排在第一位。然后按date_col DESC排序。

结果

date_col
--------
2013
2012
2011
older

【讨论】:

    【解决方案2】:

    一个(肮脏的)技巧是使用bin 函数:它将为非数字字符串返回'0',因此'older' 将首先出现:

    SELECT   *
    FROM     mytable
    ORDER BY BIN(year_column)
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      SELECT * FROM t5 ORDER BY BIN(samp_data) DESC;

      【讨论】:

        【解决方案4】:

        我们可以不使用ISNUMERIC()函数代替NOT LIKE

        DECLARE @test TABLE
        (
        value varchar(10)
        )
        INSERT INTO @test
        VALUES
        ('2010'),
        ('2011'),
        ('2012'),
        ('2013'),
        ('2014'),
        ('2015'),
        ('older')
        
        SELECT * From @test
        ORDER BY 
            (CASE  WHEN ISNUMERIC(value) = 1 THEN 0 ELSE 1 END),value DESC
        

        【讨论】:

          【解决方案5】:

          这将首先显示数字行

          Select * 
          From  [Table Name] 
          Order By IsNumeric([Column Name]) DESC, [Column Name] DESC
          

          【讨论】:

            猜你喜欢
            • 2011-12-22
            • 2016-09-03
            • 1970-01-01
            • 2015-12-14
            • 2014-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-23
            相关资源
            最近更新 更多