0

私のデータベースシステムは PostgreSQL 8.4 です

以下はスキーマの例です。

CREATE TABLE items(
  item_code varchar(20) NOT NULL PRIMARY KEY,
  item_description varchar(200),
  item_pieces_per_pack integer
);

CREATE TABLE customer_orders (
  order_id integer,
  item_code varchar(20),
  required_shipping_date date,
  quantity integer,
  PRIMARY KEY (order_id ,item_code,required_shipping_date)
);

INSERT INTO items VALUES ('AL0000063','PANETTONE CLASSICO BASSO 1KG',1);
INSERT INTO items VALUES ('AL0000064','PANDORO CLASSICO 1KG',1);
INSERT INTO items VALUES ('AL0000065','TORRONE CIOCCOLATO E NOCCIOLE 250G',4);
INSERT INTO items VALUES ('AL0000066','CANTUCCI TOSCANI 100G',6);
INSERT INTO items VALUES ('AL0000067','SAGRANTINO DI MONTEFALCO',6);
INSERT INTO items VALUES ('AL0000068','BAROLO',6);
INSERT INTO items VALUES ('AL0000069','AMARONE',6);


INSERT INTO customer_orders VALUES (1,'AL0000063','2013-12-15',5);
INSERT INTO customer_orders VALUES (1,'AL0000066','2013-12-15',15);
INSERT INTO customer_orders VALUES (1,'AL0000067','2013-12-14',15);
INSERT INTO customer_orders VALUES (2,'AL0000063','2013-12-11',25);
INSERT INTO customer_orders VALUES (2,'AL0000064','2013-12-11',25);
INSERT INTO customer_orders VALUES (2,'AL0000067','2013-12-13',25);
INSERT INTO customer_orders VALUES (3,'AL0000063','2013-12-13',25);
INSERT INTO customer_orders VALUES (3,'AL0000065','2013-12-10',10);
INSERT INTO customer_orders VALUES (3,'AL0000065','2013-12-20',10);

テーブル「アイテム」から、配列内の item_code のみを取得する必要があります。次のクエリは正常に機能します。

SELECT * FROM items
WHERE item_code = ANY('{AL0000063,AL0000064,AL0000065}'::text[])

しかし、array_agg でサブクエリを使用すると、次のようになります。

SELECT * FROM items
WHERE item_code = ANY(
  SELECT array_agg(DISTINCT item_code) 
  FROM customer_orders 
  WHERE required_shipping_date BETWEEN '2013-12-01' AND '2013-12-15')

PostgreSQL で次のエラーが発生します。

エラー: 演算子が存在しません: 文字可変 = 文字可変[] 行 2: WHERE item_code = ANY( ^ ヒント: 指定された名前と引数の型に一致する演算子はありません。明示的な型キャストを追加する必要がある場合があります。


なんで?

4

1 に答える 1

2

varchar[] への追加のキャストを使用すると正常に動作するため、Postgres による SQL の解析を使用する必要があります。

 SELECT * FROM items
WHERE item_code = ANY((
  SELECT array_agg(DISTINCT item_code)
  FROM customer_orders
  WHERE required_shipping_date BETWEEN '2013-12-01' AND '2013-12-15')::varchar[]);

とにかく、この場合、配列を使用する必要はありません:

SELECT * FROM items
WHERE item_code IN (
  SELECT DISTINCT item_code
  FROM customer_orders
  WHERE required_shipping_date BETWEEN '2013-12-01' AND '2013-12-15');
于 2013-10-24T13:01:10.973 に答える