2011-02-04 9 views
23

私は製品を含む必要があるSQLiteデータベースを持っています。これらの製品には、カテゴリ、グループ、および製品番号(cccccc.gg.ppp)からなる固定フォーマットの複合製品番号があります。新しい製品が挿入されるたびに、新しい製品番号はカテゴリ番号とグループ番号を使用して作成し、そのグループ内の最高の製品番号を1つ増やしてください。数値を先行ゼロでフォーマットするSQLite関数?

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

しかし、私たちはしている場合がありますので、私はむしろ、カスタム関数を記述していないと思います:-(

...内蔵の私はこれをやらせるだろうSQLiteの機能を見つけるように見えることはできません

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

答えて

48

これは、文字列連結とsubstr機能を使用して少しのマジックで達成できます。長い話が短く、あなたが望むものがここにあります:

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

説明が続きます。

まず、SQLiteの文字列連結演算子が||であることがわかります。

私たちは、返す値と同じ長さの文字列を取ります。たとえば、長さが常に10文字の数値を返したい場合は、0が埋め込まれたままにしておきたい場合は、0の文字列で開始します。そのために、返す番号を連結します。この例では、それは '1234'です。これまでのところ、次のような部分があります。'0000000000'||'1234'

次に、そのすべてをsubstr関数に渡します。 substr機能がどのように動作するかAccording to the documentationは、ここにあります:

SUBSTR(X、Y、Z)関数は、Y番目の文字で始まり、長いZの文字である入力文字列Xの部分文字列を返します。 ... Yが負の場合、部分文字列の最初の文字は、左よりも右から数えて見つけられます。

文字列を10文字にしたい場合は、Yパラメータとして-10を渡します(右から数えて10文字戻します)。そして、10をZパラメータとして渡します。 。

+0

を参照してください。説明がなく、同様の回答が受け入れられています:( –

+0

あなたは上司です – Claudio

11

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10)が動作します。'1234'を製品番号で置き換えてください(長さは< = 10です)。

+0

エレガントではありませんが機能的です(+1)。ありがとう。 – Christian

0

@ 9000からの質問への直接的な回答に加えて、カテゴリ、グループ、および製品番号を実際にテキストとして保存するべきではないかどうかを考えてください。

+0

なぜテキストとして保存するのか数値として保存するのか? (特に製品番号は、次の製品番号のために最大値+ 1を取得する必要があるためです)。 – Martijn

+1

テキストは先頭にゼロを保持します。あなたの要件が "000123"を格納するときに "000123"を格納するための何かがあります。 –

+0

は問題ではありません。私は次の価値を得る必要があります。これは数値として利用できることを意味し、ゼロ接頭文字列に変換します。それがどのように格納されるかは、全く別の問題です。 – Martijn

4

私は、これは古い質問ですけど、次は単純です:あなたが最後に選択している場合

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

substrは、長さを必要としません。

関連する問題