製品を含める必要があるSQLiteデータベースがあります。これらの製品には、カテゴリ、グループ、および製品番号(cccccc.gg.ppp)で構成される固定形式の複合製品番号があります。新しい製品が挿入されるたびに、カテゴリ番号とグループ番号を使用して新しい製品番号を作成し、その後にそのグループ内の最大の製品番号を1ずつ増やしていく必要があります。
そのために、3つの番号すべてを別々のフィールドに格納し、ビューを使用して製品番号を動的に組み立てることを考えていました。これを機能させるには、製品番号の形式が固定されているため、先行ゼロを追加する必要があります。
ただし、これを実行できる組み込みのSQLite関数が見つからないようです... :-(
他の開発者がデータを読み取るためにデータベースを共有する必要があるかもしれないので、カスタム関数を作成したくありません。そして、彼らがどのプラットフォームや言語を使用するのかわかりません。
これはできますか?それとも、別の解決策を見つける必要がありますか?
これは、文字列の連結とsubstr
関数を使用して少し魔法をかけることで実現できます。簡単に言えば、これがあなたが望むものです:
select substr('0000000000'||'1234', -10, 10)
以下に説明があります。
まず、SQLiteの文字列連結演算子が||
であることを知ってください。
まず、返したい値と同じ長さの文字列を取得します。たとえば、常に10文字の長さの数値を返し、それより短い場合は0
sを埋めたままにしておきたい場合は、10個の0
sの文字列から始めます。そのために、返送する番号を連結します。この例では、それは「1234」です。これまでのところ、次のような部分があります:'0000000000'||'1234'
次に、そのすべてをsubstr
関数に渡します。 ドキュメントによると 、substr
関数のしくみは次のとおりです。
Substr(X、Y、Z)関数は、Y番目の文字で始まりZ文字の長さの入力文字列Xの部分文字列を返します。 ... Yが負の場合、部分文字列の最初の文字は、左ではなく右から数えることによって検出されます。
したがって、文字列の長さを10文字にする場合は、Yパラメーターとして-10を渡し(右から10文字後ろにカウントを開始します)、Zパラメーターとして10を渡します(合計10文字を取ります)。
select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10)
は機能します;代用'1234'
製品番号、任意の長さ<= 10。
3.8.3(2014)以降 printf を次のように使用できます。
SELECT printf("%04d", product_number) AS product_number FROM table;
4を必要な桁数に変更します。これにより、product_number1に対して0001が返されます。
これは古い質問ですが、次の方が簡単です。
-- zero-pad to 4 digits:
select substr('0000'||3,-4);
substr
は、最後まで選択する場合は長さを必要としません。