web-dev-qa-db-ja.com

先行ゼロで数値をフォーマットするSQLite関数?

製品を含める必要があるSQLiteデータベースがあります。これらの製品には、カテゴリ、グループ、および製品番号(cccccc.gg.ppp)で構成される固定形式の複合製品番号があります。新しい製品が挿入されるたびに、カテゴリ番号とグループ番号を使用して新しい製品番号を作成し、その後にそのグループ内の最大の製品番号を1ずつ増やしていく必要があります。

そのために、3つの番号すべてを別々のフィールドに格納し、ビューを使用して製品番号を動的に組み立てることを考えていました。これを機能させるには、製品番号の形式が固定されているため、先行ゼロを追加する必要があります。

ただし、これを実行できる組み込みのSQLite関数が見つからないようです... :-(

他の開発者がデータを読み取るためにデータベースを共有する必要があるかもしれないので、カスタム関数を作成したくありません。そして、彼らがどのプラットフォームや言語を使用するのかわかりません。

これはできますか?それとも、別の解決策を見つける必要がありますか?

26
Martijn

これは、文字列の連結とsubstr関数を使用して少し魔法をかけることで実現できます。簡単に言えば、これがあなたが望むものです:

select substr('0000000000'||'1234', -10, 10)

以下に説明があります。

まず、SQLiteの文字列連結演算子が||であることを知ってください。

まず、返したい値と同じ長さの文字列を取得します。たとえば、常に10文字の長さの数値を返し、それより短い場合は0sを埋めたままにしておきたい場合は、10個の0sの文字列から始めます。そのために、返送する番号を連結します。この例では、それは「1234」です。これまでのところ、次のような部分があります:'0000000000'||'1234'

次に、そのすべてをsubstr関数に渡します。 ドキュメントによるとsubstr関数のしくみは次のとおりです。

Substr(X、Y、Z)関数は、Y番目の文字で始まりZ文字の長さの入力文字列Xの部分文字列を返します。 ... Yが負の場合、部分文字列の最初の文字は、左ではなく右から数えることによって検出されます。

したがって、文字列の長さを10文字にする場合は、Yパラメーターとして-10を渡し(右から10文字後ろにカウントを開始します)、Zパラメーターとして10を渡します(合計10文字を取ります)。

57
Steve Moore

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10)は機能します;代用'1234'製品番号、任意の長さ<= 10。

11
9000

3.8.3(2014)以降 printf を次のように使用できます。

SELECT printf("%04d", product_number) AS product_number FROM table;

4を必要な桁数に変更します。これにより、product_number1に対して0001が返されます。

5
shao.lo

これは古い質問ですが、次の方が簡単です。

--  zero-pad to 4 digits:
select substr('0000'||3,-4);

substrは、最後まで選択する場合は長さを必要としません。

5
Manngo