ORDER BY对数字不起作用,但是如果我给出包含字母数字或仅包含字符的列,它就能正常工作。我给出的代码是,
dbResult = dbStatement.executeQuery("SELECT Bid_Number,Vendor_Name,Vendor_Address,Amount,Tax_Percentage,Amount_Aftertax,Expected_Deliverydate,Vendor_Code FROM purchase_bid where PE_Number='"+PENumber+"' ORDER BY Amount_Aftertax ASC");
如果在我的表格中我将Amount_Aftertax
列值视为
840.0
780.0
3180.0
3810.0
通过提供此代码,我按照此顺序获得结果
3180.0
3810.0
780.0
840.0
希望得到答复...... 提前谢谢..
答案 0 :(得分:7)
听起来您的列类型仍然是 text 列,即使它包含数字 - 因此它们按字典顺序排序。如果您希望将它们作为数字处理,则应该使列键入一个数字。
这不仅会影响排序,当然 - all 当您为列使用适当的类型时,您的代码可能会得到改善。仅仅因为你可以几乎坚持字符串中的任何数据并不意味着它是个好主意。选择与所涉及的真实数据最匹配的数据类型。
此外,您不应该像这样指定PENumber值 - 您应该使用预准备语句,在SQL中使用占位符参数,您可以单独提供值。动态构造SQL可能会导致SQL Injection vulnerabilities,以及不必要的转换以及代码与数据的分离。
答案 1 :(得分:2)
它正在工作..它按字母顺序排序!您已将此列声明为varchar,因此将其视为字符串中的数据。所以3是字母表中的8之前,这就是它之前的原因..如果你想将数字排序为数字而不是字符串,你需要将列类型更改为int!
答案 2 :(得分:1)
结果以这种方式排序,因为它将其视为文本。 '3'出现在'7'之前,所以任何从'3'开始的东西,即使它是一个更高的数字,也会按照一个单词排序。
确保您的数据库具有格式化为数值的字段 - 在您的情况下,您需要float
类型,因为您的数字后似乎有小数位。完成后,它将正确格式化。
答案 3 :(得分:0)
SELECT * FROM table_name ORDER BY convert(`column_name`, decimal) DESC;
应该是这样的。您应该先将varchar2转换为十进制,然后进行排序。
注意:确保在column_name中使用``代替''。 另外,最好将字段类型转换为数字,如果为时已晚,请使用它。