web-dev-qa-db-ja.com

0で始まる番号を含むSQLite ORDER BY文字列

タイトルのとおり:

私は選択クエリを持っていますが、これは数字を含むフィールドを「並べ替え」ようとしていますが、この数字は実際には0で始まる文字列なので、「並べ替え」はこれをしています...

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

何かご意見は?

編集:これを行う場合: "... ORDER BY(field + 1)"これは、文字列が内部的に整数に変換されているため、回避することができます。これは、Cのatoiのように「公式に」変換する方法ですか?

CASThttp://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
>>>
_

私たちが見ることができるように、それほど遅くはありませんが、少し遅くなります。

64
Samy Vilar

CASTを使用できます:

ORDER BY CAST(columnname AS INTEGER)
31
skinnynerd

カーソルローダーを使用した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
Ko Nyan

Skinnynerd に感謝します。 Kotlinで、CASTは次のように機能しました。CASTは、10よりも9 OR 22よりも22を優先する問題を修正しました。

後で必要に応じて変更するグローバル変数を定義し、クエリにプラグインします。

var SortOrder:String?=null

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

子孫の場合:

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

(最高から最低まで)

昇順の場合:

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

(最低から最高へ)

0
BlackHatVisions

SQL SERVERで列値の数値形式による順序を使用するCONVERT CAST関数

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

0
wilfred