38

タイトルが示すように:

数値を含むフィールドを「順序付け」しようとしているselectクエリがあります。この数値は実際には0で始まる文字列であるため、「orderby」はこれを実行しています...

...
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は、10よりも9、206よりも22を優先する問題を修正します。

後でオンデマンドで変更するグローバル変数を定義し、それをクエリにプラグインします。

var SortOrder:String?=null

順序の使用を変更するには:

子孫の場合:

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

(最高から最低へ)

昇順の場合:

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

(最低から最高へ)

于 2017-10-30T20:50:32.700 に答える
0

SQLSERVERの列値番号形式による順序を使用したCONVERTCAST関数

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

于 2018-10-09T11:54:35.160 に答える