包含从0开始的数字的SQLite ORDER BY字符串

时间:2012-07-15 03:01:51

标签: sql string sqlite sql-order-by numeric

如标题所述:

我有一个选择查询,我试图“按顺序”包含数字的字段,事实是这些数字实际上是以0开头的字符串,所以“order by”正在执行此操作... < / p>

...
10
11
12
01
02
03
...

有什么想法吗?

编辑:如果我这样做:“... ORDER BY(字段+ 1)”我可以解决这个问题,因为不知何故,字符串在内部被转换为整数。这是一种像C's atoi一样“正式”转换它的方法吗?

5 个答案:

答案 0 :(得分:63)

您可以使用CAST http://www.sqlite.org/lang_expr.html#castexpr将表达式强制转换为整数。

sqlite> CREATE TABLE T (value VARCHAR(2));
sqlite> INSERT INTO T (value) VALUES ('10');
sqlite> INSERT INTO T (value) VALUES ('11');
sqlite> INSERT INTO T (value) VALUES ('12');    
sqlite> INSERT INTO T (value) VALUES ('01');
sqlite> INSERT INTO T (value) VALUES ('02');
sqlite> INSERT INTO T (value) VALUES ('03');
sqlite> SELECT * FROM T ORDER BY CAST(value AS INTEGER);
01
02
03
10
11
12
sqlite>
  

如果我这样做:“... ORDER BY(字段+ 1)”我可以解决这个问题,因为不知何故,字符串在内部被转换为整数。是否像C's atoi一样“正式”转换它?

这很有意思,虽然我不知道有多少DBMS支持这样的操作所以我不推荐它以防你需要使用不支持它的其他系统,更不用说了你正在添加一个可能影响性能的额外操作,但你也这样做ORDER BY (field + 0)我将调查性能

取自sqlite3 docs:

  

CAST表达式用于将值转换为不同的存储类,其方式与将列关联性应用于值时发生的转换类似。 CAST表达式的应用与列亲缘关系的应用不同,与CAST表达式一样,即使存储类转换是有损且不可逆的,也会强制执行存储类转换。

     

4.0运营商
  所有数学运算符(+, - ,*,/,%,&lt;&lt;&gt;&gt;,&amp;和|)在执行之前将两个操作数强制转换为NUMERIC存储类。即使它是有损且不可逆转的,演员也会被执行。数学运算符上的NULL操作数产生NULL结果。数学运算符上不以任何方式查看数字且不为NULL的操作数将转换为0或0.0。

我很好奇所以我跑了一些基准:

>>> setup = """
... import sqlite3
... import timeit
... 
... conn = sqlite3.connect(':memory:')
... c = conn.cursor()
... c.execute('CREATE TABLE T (value int)')
... for index in range(4000000, 0, -1):
...     _ = c.execute('INSERT INTO T (value) VALUES (%i)' % index)
... conn.commit()
... """
>>> 
>>> cast_conv = "result = c.execute('SELECT * FROM T ORDER BY CAST(value AS INTEGER)')"
>>> cast_affinity = "result = c.execute('SELECT * FROM T ORDER BY (value + 0)')"
>>> timeit.Timer(cast_conv, setup).timeit(number = 1)
18.145697116851807
>>> timeit.Timer(cast_affinity, setup).timeit(number = 1)
18.259973049163818
>>>

我们可以看到它有点慢但不是很有趣。

答案 1 :(得分:30)

您可以使用CAST

ORDER BY CAST(columnname AS INTEGER)

答案 2 :(得分:3)

在带有光标加载器的ListView中!

String projection= some string column;
String selection= need to select;

String sort="CAST ("+ YOUR_COLUMN_NAME + " AS INTEGER)";

CursorLoader(getActivity(), Table.CONTENT_URI, projection, selection, selectionArgs, sort);

答案 3 :(得分:0)

感谢Skinnynerd。与Kotlin一起,CAST的工作原理如下: CAST修复了优先考虑优先于10或者超过206的OR 22的问题。

定义全局变量以便稍后根据需要进行更改,然后将其插入查询中:

var SortOrder:String?=null

改变订单使用:

对于后代:

 SortOrder = "CAST(MyNumber AS INTEGER)" + " DESC"

(从最高到最低)

升序:

 SortOrder =  "CAST(MyNumber AS INTEGER)" + " ASC"

(从最低到最高)

答案 4 :(得分:0)

CONVERT CAST 函数在 SQL SERVER

中使用按列值数字格式排序
SELECT * FROM Table_Name ORDER BY CAST(COLUMNNAME AS INT);