MySQL / MariaDB按混合数据类型排序

时间:2015-09-16 10:08:46

标签: mysql sql casting

我有一个表(variable_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之后排序。我试图对类型进行排序,然后是铸造值,但这也不起作用。

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

1 个答案:

答案 0 :(得分:0)

您可以投射值。 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