【问题标题】: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 by 和 WHERE 子句,而不是完整的 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