0

int2[]配列のタイプの列があります。そして、この列でINクエリを作成したいと思います。

グーグルで検索し、@>演算子で配列列を検索しましたが、int2型の配列列では機能しないようです。しかし、それはint[]で機能します

int2 []で機能しない理由を誰かが知っていますか?

ecabuk=# CREATE TABLE "Test"("Column1" int2[]);
CREATE TABLE

ecabuk=# INSERT INTO "Test" VALUES ('{10, 15, 20}');
INSERT 0 1

ecabuk=# INSERT INTO "Test" VALUES ('{10, 20, 30}');
INSERT 0 1

ecabuk=# EXPLAIN ANALYZE SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20];
ERROR:  operator does not exist: smallint[] @> integer[]
LINE 1: ...LAIN ANALYZE SELECT * FROM "Test" WHERE "Column1" @> ARRAY[2...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

ecabuk=# ALTER TABLE "Test" ALTER COLUMN "Column1" type int[];
ALTER TABLE

ecabuk=# EXPLAIN ANALYZE SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20];
                                            QUERY PLAN                                            
--------------------------------------------------------------------------------------------------
 Seq Scan on "Test"  (cost=0.00..26.38 rows=7 width=32) (actual time=0.200..0.204 rows=2 loops=1)
   Filter: ("Column1" @> '{20}'::integer[])
 Total runtime: 0.256 ms
(3 rows)

ecabuk=# 
4

2 に答える 2

1

ARRAY [20]を指定すると、それはint2[]ではなくint[]として扱われます。適切なキャストはそれを動作させます。

test=# EXPLAIN ANALYZE SELECT * FROM "Test" WHERE "Column1" @> ARRAY[2];
ERROR:  operator does not exist: smallint[] @> integer[]
LINE 1: ...LAIN ANALYZE SELECT * FROM "Test" WHERE "Column1" @> ARRAY[2...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
test=# EXPLAIN ANALYZE SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20::int2];
                                            QUERY PLAN

--------------------------------------------------------------------------------------------------
 Seq Scan on "Test"  (cost=0.00..26.38 rows=7 width=32) (actual time=0.060..0.064 rows=2 loops=1)
   Filter: ("Column1" @> '{20}'::smallint[])
 Total runtime: 0.116 ms
(3 rows)


test=# EXPLAIN ANALYZE SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20]::int2[];
                                            QUERY PLAN

--------------------------------------------------------------------------------------------------
 Seq Scan on "Test"  (cost=0.00..26.38 rows=7 width=32) (actual time=0.028..0.032 rows=2 loops=1)
   Filter: ("Column1" @> '{20}'::smallint[])
 Total runtime: 0.080 ms
(3 rows)
于 2013-02-19T21:43:16.417 に答える
0

ここで動作します。あなたはそれが失敗した例を提供する必要があるでしょう:私は恐れています:

=> SELECT ARRAY[1,2,3]::int2[] @> ARRAY[1,2]::int2[];
 ?column? 
----------
   t
  (1 row)

=> SELECT ARRAY[1,2,3]::int2[] @> ARRAY[3,4]::int2[];
 ?column? 
----------
  f
 (1 row)

anyarrayで定義されているため、機能しなかった場合は奇妙になります。

=> \do '@>'
                               List of operators

   Schema   | Name | Left arg type | Right arg type | Result type | Description 
------------+------+---------------+----------------+-------------+-------------
 pg_catalog | @>   | aclitem[]     | aclitem        | boolean     | contains
 pg_catalog | @>   | anyarray      | anyarray       | boolean     | contains
 ...

9.1および9.2でテスト済み

于 2013-02-19T20:04:47.543 に答える