31

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

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

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

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

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

4

4 に答える 4

80

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

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

説明は次のとおりです。

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

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

次に、そのすべてをsubstr関数に渡します。documentation によるとsubstr関数の仕組みは次のとおりです。

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

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

于 2012-03-07T14:22:08.240 に答える
20

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

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

4 を必要な桁数に変更します。これは、product_number 1 に対して 0001 を返します。

于 2018-06-19T16:00:36.513 に答える
12

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10)動作します。'1234'10 以下の任意の長さの製品番号に置き換えてください。

于 2011-02-04T16:12:17.010 に答える