【发布时间】:2012-02-19 19:09:10
【问题描述】:
我有一个 mysql_query
SELECT * FROM table ORDER BY CAST(row AS DECIMAL)
并且想要更改排序方向。 我尝试了 ASC 和 DESC 但两者都返回完全相同的排序方向。
我该如何解决?
谢谢,问候
朱利安
【问题讨论】:
标签: mysql sorting sql-order-by redirect
我有一个 mysql_query
SELECT * FROM table ORDER BY CAST(row AS DECIMAL)
并且想要更改排序方向。 我尝试了 ASC 和 DESC 但两者都返回完全相同的排序方向。
我该如何解决?
谢谢,问候
朱利安
【问题讨论】:
标签: mysql sorting sql-order-by redirect
应该可以。您是否尝试过显示您的 CAST(row AS DECIMAL) 产生了什么?
粘贴您尝试排序的数据示例。也许你那里有空值或不适合十进制类型的数字。
你用的是什么版本的mysql?也许原因是这样的(来自 mysql 帮助):
存储格式的改变也意味着 DECIMAL 列不再 支持允许值大于的非标准扩展 列定义隐含的范围。
【讨论】:
CAST(row AS DECIMAL) 产生我期望的输出。如果没有CAST(row AS DECIMAL),我可以根据需要重新排序输出。没有NULL。我使用示例数据来测试代码:{"a_1", "a_2", "a_10", "b_1", "b_2", "b_10"} 作为 row 的值
我相信您可以在 SELECT 中进行投射,然后按该新列排序。缺点当然是您的回复中会多出 1 列,但如果那多列不影响任何事情,那么一切都很好。
SELECT *, CAST(row AS DECIMAL(5,2)) AS tempCol FROM table ORDER BY tempCol
此外,您的 DECIMAL 应该理想地指定其精度。 =)
更多详情http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html
【讨论】:
{"a_1", "a_2", "a_10", "b_1", "b_2", "b_10"},当我对它进行ASC或DESC排序时,它输出:{"a_1", "a_10", "a_2", "b_1", "b_10", "b_2"}但那是错误的,因为2应该在1之后,10在2之后,依此类推。
如果您的row 列中只有一个_ 字符,并且在字母之前的部分和数字之后的部分,这将起作用:
SELECT
*
, SUBSTRING_INDEX(row, '_', 1) AS FirstPart
, CAST(SUBSTRING_INDEX(row, '_', -1) AS UNSIGNED) AS SecondPart
FROM
TableX
ORDER BY
FirstPart
, SecondPart
【讨论】:
'abc_123' 和'abc_1_2_3' 和'abc.1.2.3' 和'a._1.b1_23a'(可能还有许多其他变体)?