MySQL/MariaDB 混合数据类型排序

标签 mysql sql casting

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

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

我希望能够对值列进行排序,并正确排序数字、日期和文本值。为此,我使用“type”列使用 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 支持隐式类型转换,这在这种情况下非常有帮助:

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

关于MySQL/MariaDB 混合数据类型排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32605620/

相关文章:

php - 为 foreach 循环中缺失的项目创建零值

SQL Server 死锁和数据页

sql - Postgresql 选择第一个字母不是@或#的单词频率

c - 在 C 中将 float 转换为处理器内部的 int

c++ - 派生对象的 static_cast 是否总是选择大多数派生对象?

php - Laravel - 用户 'root' 已经有超过 'max_user_connections' 个事件连接

mysql - 将自定义字段添加到基本客户端集成选项

mysql - 如何创建一个数据库来接收来自其他数据库的数据、手动输入和数据导出以创建 Web 仪表板?

sql - 用数值替换 SQL 索引文本列会使其更快吗?

c++ - 可以为 CString 返回堆栈对象吗?为什么/GR 会导致 dynamic_cast 出现未定义的行为?