2015-11-05 62 views
9

UUIDを識別子として使用したい場合は、最初の8桁を指定してデータベースに存在するかどうかを確認します。postgresのUUIDを照会する方法

select * from TABLE where id = 'e99aec55-9e32-4c84-aed2-4a0251584941'::uuid

をしかし、これは私にエラーを与える:

通常、私は問題なくこれを行うことができます

select * from TABLE where id LIKE 'e99aec55%@'::uuid

エラー:

ERROR: invalid input syntax for uuid: "e99aec55%@" 
LINE 1: select * from TABLE where id LIKE 'e99aec55... 
              ^
Query failed 
PostgreSQL said: invalid input syntax for uuid: "e99aec55%@" 

方法はあります最初のn桁を照会するfまたはpostgresqlのUUID型?

答えて

8

あなたがuuid Sの最上位ビットを探しているので(uuid比較はPostgreSQLの中で明確に定義されているので)、あなたが実際にbetweenを使用することができます。

... 
where some_uuid between 'e99aec55-0000-0000-0000-000000000000' 
        and 'e99aec55-ffff-ffff-ffff-ffffffffffff' 
+0

これはクールです!私はuuidとuuidの文字列で表を作成することを考えていたので、通常の検索を使用します。あなたの方法は非常にうまくいきます。ありがとう! –

+0

この種の比較を使用するとPostgreSQLのパフォーマンスが分かりますか? –

+0

@ZitaoXiong実際には単純なbtreeを使用します( 'text'sを比較するよりも少し速いはずですが、それは多くのことに依存します)。 – pozs

4

UUIDはPostrgesに文字列として格納されず、16バイト長のバイナリ値として格納されます。だから、あなたが望むようにそれをクエリする唯一の方法は、まず文字列に変換することですが、そのような変換のパフォーマンスは等価比較を行うよりも悪いことになります。

また、UUIDの文字列表現にインデックスを維持する必要があるため、意味がありません。

+0

は意味をなさないが、私は何かを実装したいのですがpostgresqlのgitの短いSHAのcharctersのようなものです。何かこのような:[リンク](http://stackoverflow.com/questions/18134627/how-much-of-a-git-sha-is-generally-considered-necessary-to-uniquely-identify-a) –

+1

よくinterger/hexでエンコードされた文字列を接頭辞として別の列に格納するか、pozsによって提案された解決策を使用するだけです。 –

関連する問題