38

如标题所述:

我有一个选择查询,我试图“排序”一个包含数字的字段,问题是这个数字实际上是从 0 开始的字符串,所以“排序依据”正在这样做......

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

有什么想法吗?

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

4

5 回答 5

73

您可以使用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 (field+1)" 我可以解决这个问题,因为字符串在内部被转换为整数。是一种像 C 的 atoi 一样“正式”转换它的方法吗?

嗯,这很有趣,虽然我不知道有多少DBMS支持这样的操作,所以我不推荐它,以防万一你需要使用不支持它的不同系统,更不用说你正在添加一个额外的操作,这可能会影响性能,尽管您也这样做ORDER BY (field + 0)我要调查性能

取自 sqlite3 文档:

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

4.0 运算符
所有数学运算符(+、-、*、/、%、<<、>>、& 和 |)在执行之前将两个操作数转换为 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
>>>

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

于 2012-07-15T03:12:50.630 回答
33

你可以使用CAST

ORDER BY CAST(columnname AS INTEGER)
于 2012-07-15T03:12:21.013 回答
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);
于 2015-01-12T16:15:34.623 回答
0

感谢Skinnynerd。在 Kotlin 中,CAST 的工作方式如下:CAST 解决了 9 优先于 10 或 22 优先于 206 的问题。

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

var SortOrder:String?=null

更改订单使用:

对于后代:

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

(从最高到最低)

对于上升:

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

(从最低到最高)

于 2017-10-30T20:50:32.700 回答
0

在 SQL SERVER 中使用按列值数字格式排序的 CONVERT CAST 函数

SELECT * FROM Table_Name ORDER BY CAST(COLUMNNAME AS INT);

于 2018-10-09T11:54:35.160 回答