我有一张桌子用于ex table1 它有列名:id,name,amount。
id name amount
1 abc 20
2 xyz 50
3 pqr 246
我想将它从最大值到最小值排序。 我写了这个查询:
SELECT * FROM table1 ORDER BY amount DESC;
但它提供如下输出:
id name amount
2 xyz 50
3 pqr 246
1 abc 20
这是我想要的无效输出,我希望输出如下:
id name amount
3 pqr 246
2 xyz 50
1 abc 20
所以,如果有人知道这个问题的解决方案,请给我解决方案。
答案 0 :(得分:3)
您将amount
存储为字符串,它会出现。
这是两个解决方案。您可以将值转换为排序的数字:
order by amount + 0 desc
或者,先按长度排序,然后按值排序:
order by length(amount) desc, amount desc
通常,在SQL中,您应该使用内置类型并将值存储为适当的时间。数字应存储为数字(整数,浮点数或小数)。日期和时间应存储为日期/时间类型。字符串可以用于字符串值。
答案 1 :(得分:0)
它与错误的数据类型有关。
将amount
列的数据类型设置为INT或FLOAT。
答案 2 :(得分:0)
使用
等命令查看表的设计DESC TABLENAME
我怀疑您的Amount列是text / varchar而不是数字。
或者只需运行以下命令,然后尝试查询。
ALTER TABLE TABLE1 ALTER COLUMN AMOUNT INT
答案 3 :(得分:0)
始终使用适当的数据类型来存储数据。
由于amount
列的数据类型是字符串而非数字, ORDER BY 会根据 ASCII 值对其进行排序
SQL> WITH DATA(ID, NAME, amount) AS(
2 SELECT 2, 'xyz', '50' FROM dual UNION ALL
3 SELECT 3, 'pqr', '246' FROM dual UNION ALL
4 SELECT 1, 'abc', '20' FROM dual
5 )
6 SELECT * FROM DATA
7 ORDER BY amount DESC;
ID NAM AMO
---------- --- ---
2 xyz 50
3 pqr 246
1 abc 20
SQL>
如果您只将数字数据存储为字符串,那么您可以使用 TO_NUMBER 在排序时将字符串显式转换为数字。
ORDER BY to_number(amount) DESC
例如,
SQL> WITH DATA(ID, NAME, amount) AS(
2 SELECT 2, 'xyz', '50' FROM dual UNION ALL
3 SELECT 3, 'pqr', '246' FROM dual UNION ALL
4 SELECT 1, 'abc', '20' FROM dual
5 )
6 SELECT * FROM DATA
7 ORDER BY to_number(amount) DESC;
ID NAM AMO
---------- --- ---
3 pqr 246
2 xyz 50
1 abc 20
SQL>