2017-05-05 12 views
1

私はPostgresqlを使ってRuby gemのバージョン番号を格納しています。私はこれらのバージョンをユーザーが提供するカスタム述語とベースバージョンでフィルタリングしたいと思います。そのために、両方のバージョンを整数の配列に変換しています(比較のため)。4.2.0'{4,2,0}'になります。PostgreSQLで長さの異なる配列を比較する

これは正常に動作します:配列の長さが異なる場合

'{4,0,0}' < '{4,1,0}' # yields TRUE 

はそれでも、私は問題を抱えています:

'{4}' < '{5,0,0}' # yields TRUE 
'{4,1,2}' < '{4,1}' # also yields TRUE when it should be FALSE 

私はドキュメントのこの特定の問題に関連して何かを見つけることができませんでした。どのように私は後に何を達成することができますか?より少ない要素を持つ配列がゼロ(私の期待された振る舞いにつながる)で埋められているなら、素晴らしいでしょう。

+1

"array"が意味することはわかりませんが、 'select '{4,1,2}' :: int [] <'{4,1}' :: int [];'はFALSEを返します。 .. – Abelisto

+0

ああ、私は確かに疲れている。これを指摘してくれてありがとう!あなたはそれに対する答えを加えることができます。 – linkyndy

+0

それはちょうどタイプミスだと思うことができます:o)幸運。 – Abelisto

答えて

0

1つの方法は、アレイの変換を'{4,1}'にするときに、すべてのバージョンの配列の長さを標準化することです。'{4,1,0}'です。

あなたがarray_length(array,dimension)を使用して変換後の各配列内の要素の数を確認し(この場合dimensionが1である)、次いでarray_append(array, element)を使用 を追加することができ、戻り値に応じて、1つのまたは2つのゼロ(この場合、elementは0です)。その後

あなたが比較します:
'{4,0,0}' < '{5,0,0}' # will still yield TRUE '{4,1,2}' < '{4,1,0}' # will now correctly yield FALSE

EDITを:以下のコメントとして、これが唯一の元の配列の各要素が一桁の整数または数値文字で構成されている場合です。文字列全体が比較されているため、文字列の数値要素が1文字以上の長さになると失敗する可能性があります。

+0

しかし、 'select '{40,1,2}' <'{4,1,0}';' TRUE':o) – Abelisto

+0

'{1,2,3}'は実際に整数とは関係がありませんが、それはちょうどいくつかのコンテンツを持つ文字列です。明らかにOPとあなたはまだ2つの配列の代わりに2つの文字列を比較しようとしています...(ヒント:質問の下で私のコメントを参照してください) – Abelisto

+0

元の配列の各要素が1桁の整数数字です。文字列全体が比較されているので、文字列の数値要素が1文字以上の長さであれば、@Abelistoが指摘したように失敗する可能性があります。 –

関連する問題