Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 顺序VARCHAR和数字_Sql_Oracle_Sql Order By - Fatal编程技术网

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