マルち*_* だよ 35 sql sqlite string numeric sql-order-by
正如标题所述:
我有一个选择查询,我试图"按顺序"包含数字的字段,事实是这些数字实际上是以0开头的字符串,所以"order by"就是这样做...
...
10
11
12
01
02
03
...
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
编辑:如果我这样做:"... ORDER BY(字段+ 1)"我可以解决这个问题,因为不知何故,字符串在内部被转换为整数.这是一种像C's atoi一样"正式"转换它的方法吗?
Sam*_*lar 65
您可以使用CAST http://www.sqlite.org/lang_expr.html#castexpr将表达式转换为Integer.
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>
Run Code Online (Sandbox Code Playgroud)
如果我这样做:"... ORDER BY(字段+ 1)"我可以解决这个问题,因为不知何故,字符串在内部被转换为整数.是否像C's 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
>>>
Run Code Online (Sandbox Code Playgroud)
我们可以看到它有点慢,虽然不是很多,有趣.
| 归档时间: |
|
| 查看次数: |
27206 次 |
| 最近记录: |