Ist es möglich, eine Integer-Spalte so zu formatieren, dass sie ein Komma als Tausendertrennzeichen in Sqlite hat? Ich möchte, dass das Abfrageergebnis wie folgt aussieht.
Id Name Price
1 Product1 1,000
2 Product2 2,500
Ist es möglich, eine Integer-Spalte so zu formatieren, dass sie ein Komma als Tausendertrennzeichen in Sqlite hat? Ich möchte, dass das Abfrageergebnis wie folgt aussieht.
Id Name Price
1 Product1 1,000
2 Product2 2,500
SQLite verfügt nicht über eine interne Funktion zur Zahlenformatierung, aber Sie können eine benutzerdefinierte Funktion um eine zu erstellen.
Hier ein praktisches Beispiel. Verwendet Ganzzahlen und muss für Floats angepasst werden.
#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));
}
Wenn Ihre Daten in einer Tabelle gespeichert sind und Sie die SQLite Version 3.8.3 oder höher, dann ist es möglich, das Gewünschte mit einer rekursiven CTE zu erreichen.
Im Folgenden finden Sie ein funktionierendes SQL-Beispiel, das zeigt, worauf ich mich beziehe.
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
Wenn Ihre Tabelle die folgenden Zahlen enthielte -
NBR
25271
7
29
75438175
342
212
4758
863
2313917
Dann würde die Abfrage ausgeben -
NBR_FORMATTED
25,271
7
29
75,438,175
342
212
4,758
863
2,313,917
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.