2011-11-25 11 views
4

Sqliteで1000番目の区切り文字としてカンマを持つように整数列をフォーマットすることはできますか?私は、クエリの結果を次のようにしたいと思います。Sqlite:整数をフォーマットする

Id Name  Price 
1 Product1 1,000 
2 Product2 2,500 
+3

SQLiteは、フォーマットを認識していません。データを抽出するために使用するプログラムは、書式設定を担当します。 –

+0

理想的には、SQLiteを呼び出す環境がそれを処理します。 – MPelletier

答えて

1

ありのSQLiteに組み込まれた内部番号の書式設定機能はありませんが、1を作成するためにuser-defined functionを作成することができます。

実例があります。整数を使用し、浮動小数点数の調整が必要です。あなたのデータは、テーブルに格納され、あなたがSQLite version 3.8.3以上を使用している場合

#import <sqlite3.h> 
static char *sepnum(int num, char *buf, size_t buflen, char sepch) 
{ 
    int len = 0, negative = 0; 
    if (!buf || buflen == 0) return buf; 
    if (num < 0) 
    { 
     negative = 1; 
     num = abs(num); 
    } 
    for (int i=1;;i++) 
    { 
     if (buflen>len+1) buf[len++] = '0' + (num % 10); 
     num /= 10; 
     if (num==0) break; 
     if ((i % 3) == 0 && buflen>len+1) buf[len++] = sepch; 
    } 
    if (negative && buflen>len+1) buf[len++] = '-'; 
    for (int i=0;i<len/2;i++) 
    { 
     buf[len] = buf[i]; 
     buf[i] = buf[len-i-1]; 
     buf[len-i-1] = buf[len]; 
    } 
    if (buflen>len) buf[len] = '\0'; 
    else buf[0] = '\0'; 
    return buf; 
} 
static void nformat(sqlite3_context *context, int argc, sqlite3_value **argv) 
{ 
    if (argc == 1) 
    { 
     int num = sqlite3_value_int(argv[0]); 
     char buf[500] = ""; 
     if (sepnum(num, buf, sizeof(buf), ',')) 
     { 
      sqlite3_result_text(context, buf, -1, SQLITE_TRANSIENT); 
      return; 
     } 
    } 
    sqlite3_result_null(context); 
} 

int main(int argc, char *argv[]) 
{ 
    sqlite3 *db; 
    sqlite3_open(":memory:", &db); 
    sqlite3_stmt *stmt; 
    sqlite3_create_function(db, "nformat", 1, SQLITE_UTF8, NULL, &nformat, NULL, NULL); 
    sqlite3_prepare(db, "select nformat(1234)", -1, &stmt, NULL); 
    sqlite3_step(stmt); 
    printf("[%s]\n", sqlite3_column_text(stmt, 0)); 
} 
+0

ご返信ありがとうございます。私はdev envがAndroidであることを忘れていました。だから私はあなたの解決策を試していない。 – wannik

1

、あなたが再帰CTEを使用して欲しいものを達成することが可能です。

以下は、私が言及している作業SQLの例です。あなたのテーブルには、次の番号含まれている場合

WITH 
    NBR_LIST_ETL AS 
    (
    SELECT 
     A.*, 
      CAST(REPLACE(NBR_LENGTH % 3, 0, 3) AS INTEGER) 
     AS SUB_STRING_LENGTH 
    FROM 
     (
     SELECT 
      ID, -- INTEGER PRIMARY KEY COLUMN 
      NBR, -- INTEGER COLUMN YOU WANT TO FORMAT W/ COMMAS 
       LENGTH(NBR) 
      AS NBR_LENGTH 
     FROM 
      NBR_LIST A -- REPLACE NBR_LIST W/ YOUR TABLE NAME 
     ) A 
    ), 
    NBR_FORMAT_RECURSIVE AS 
    (
    SELECT 
     ID, 
      SUBSTR(NBR, 1, SUB_STRING_LENGTH) 
     AS NBR_SEGMENT, 
      SUBSTR(NBR, SUB_STRING_LENGTH + 1) 
     AS NBR_REMAINING, 
      NBR_LENGTH - SUB_STRING_LENGTH 
     AS NBR_LENGTH 
    FROM 
     NBR_LIST_ETL 
    UNION ALL 
    SELECT 
     ID, 
      SUBSTR(NBR_REMAINING, 1, 3) 
     AS NBR_SEGMENT, 
      SUBSTR(NBR_REMAINING, 4) 
     AS NBR_REMAINING, 
      NBR_LENGTH - 3 
     AS NBR_LENGTH 
    FROM 
     NBR_FORMAT_RECURSIVE 
    WHERE 
     NBR_LENGTH >= 3 
    ) 
SELECT 
     GROUP_CONCAT(NBR_SEGMENT) 
    AS NBR_FORMATTED 
FROM 
    NBR_FORMAT_RECURSIVE 
GROUP BY 
    ID 

-

NBR 
25271 
7 
29 
75438175 
342 
212 
4758 
863 
2313917 

を次にクエリが出力でしょう - あなたはそれ文字フィールドにする場合を除き

NBR_FORMATTED 
25,271 
7 
29 
75,438,175 
342 
212 
4,758 
863 
2,313,917 
関連する問題