Sql 顺序VARCHAR和数字
我有以下选择: 从表中选择列Sql 顺序VARCHAR和数字,sql,oracle,sql-order-by,Sql,Oracle,Sql Order By,我有以下选择: 从表中选择列 Column : VARCHAR 我想按如下顺序排列:按顺序排列的数字,然后按顺序排列的Varchar 从表中按列顺序选择列 ae 10000 10005 ad ab ac 10010 因为列是字符列,所以数字将按二进制排序。您希望对它们进行数字排序,这意味着您需要2个order BY子句 一个数字,其中只考虑数字字符 标准二进制排序 正则表达式是 ^-锚定到管柱的开头 \d-仅匹配数字 +-匹配前面的表达式任意次数 $-锚定到字符串的末尾 它用于强制在将列转换
Column : VARCHAR
我想按如下顺序排列:按顺序排列的数字,然后按顺序排列的Varchar
从表中按列顺序选择列
ae
10000
10005
ad
ab
ac
10010
因为列是字符列,所以数字将按二进制排序。您希望对它们进行数字排序,这意味着您需要2个order BY子句 一个数字,其中只考虑数字字符 标准二进制排序 正则表达式是 ^-锚定到管柱的开头 \d-仅匹配数字 +-匹配前面的表达式任意次数 $-锚定到字符串的末尾 它用于强制在将列转换为初始排序的数字之前只存在数字 更一般地说,将数字和字符放在同一列中是不明智的,因为您已经发现了这一点,而且这会阻止您强制执行数据类型是否正确
最后,考虑是否真的需要查询查询,排序通常只用于显示目的,或者将一些业务逻辑应用到排序数据集的N个元素中。你想在10之前还是之后加2?有一个混音你试过你选择语句了吗?结果是什么?然后向样本数据中添加一个混合值,然后得到结果。那么-12abs应该在哪里订购?此外,200应该在12110之前还是之后?如果在CASE表达式中计算的第一列名称不是数字,那么CASE生成的NULL将是字符串NULL。如果后面有一个数字,CASE将生成一个数字,运行时将抛出一个错误。您需要在CASE表达式中添加else cast null as number以防止出现这种情况。您能演示一下@mathguy吗?我已经对此进行了测试,甚至用子表达式select*from table\u name order by column\u name desc替换了该表,以便强制执行您所说的情况。谓词推送有一点危险,是的,但是添加一个cast不一定会有帮助。嗯。。。我收回。我只是测试了一下,它看起来不像我想的那样。我在过去遇到过这个问题,也许是工会的问题,所以我认为这在所有类似的情况下都是一个问题。在任何情况下,您的解决方案都按原样工作。
1 - 10000
2 - 10005
3 - 10010
4 - ab
5 - ac
6 - ad
7 - ae
select column_name
from table
order by case when regexp_like(column_name, '^\d+$') then to_number(column_name) end
, column_name