【问题标题】:MySQL / MariaDB order by with mixed data typesMySQL / MariaDB 使用混合数据类型排序
【发布时间】:2015-12-12 20:44:30
【问题描述】:

我有一个表 (variable_value),我在其中将多种数据类型保存在一个文本列 (value) 中。该表如下所示:

value: text
type: char(36)
entity_id: char(36)

我希望能够使用正确排序的数字、日期和文本值对值列进行排序。为此,我使用“类型”列使用 case 语句将值转换为正确的类型,一个简单的示例是根据类型转换为 DECIMAL 和 DATE:

SELECT `value`, `type` FROM variable_value ORDER BY IF(`type` = "numeric", CAST(`value` as DECIMAL), IF(`type` = "date", CAST(`value` as DATE), `value`))

我得到的结果是这样的:

*value*             *type*
1                   numeric
1                   numeric
10000               numeric
2012-01-01 00:00:00 date
2012-03-23 00:00:00 date
2012-05-08          date
2012-05-18 00:00:00 date
3                   numeric
5                   numeric

我想要的是至少将数值按正确顺序排列的东西。我不太在意结果中是否混合了不同的类型,但正如您所见,3 在 10000 之后排序。我尝试按类型排序,然后是转换后的值,但这也不起作用。

有人对如何解决这个问题有建议吗?

【问题讨论】:

    标签: mysql sql casting


    【解决方案1】:

    您可以转换值。 MySQL 支持隐式类型转换,这在这种情况下非常有用:

    order by (case when type = 'numeric' then value + 0 end)
    

    这对数字进行排序,将NULL 值赋予其他所有内容。

    或许更有序的解决方案是:

    order by type,
             (case when type = 'numeric' then value + 0 end),
             (case when type = 'date' then date(value) end),
             value
    

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 2021-02-15
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多