2017-11-11 7 views
0

を含んでいる場合、私はこのようなPostgreSQLのデータベース持っている*選択します。その後、PostgreSQLは列が配列値

users 
id  name  companyrestrictions 
1  Bill  [3, 4] 
2  Fred  [5, 6] 

そして、この場合の各企業3ための変数

は、だから私はこのようなクエリを書いた:

SELECT * FROM users WHERE 3 = ANY(users.companyrestrictions)

しかし、私は次のエラーを取得しています: OP ANY/ALL(配列)が必要です右側に配列

会社の制限は、私が間違って何をやっているタイプのjsonb

のですか?

+0

エラーとして、JSONB列で配列演算子を使用することはできません。 JSONB列内の配列内の要素をテストする同等の関数はありません。格納したいものが配列であれば、なぜ配列を使用しないのですか? –

+0

Postgres用の配列データ型がありません。それはなんと呼ばれていますか? – Jordash

+0

https://www.postgresql.org/docs/current/static/arrays.html –

答えて

3

<@operatorが含まれてみてください。

<@ Are the left JSON path/value entries contained at the top level within the right JSON value?

SELECT * FROM users WHERE '3' <@ users.companyrestrictions 

はいかなる配列のみ

+0

このエラーが返されました: '演算子が存在しません:整数<@ jsonb' – Jordash

+0

strange - ' '3'' is not integer .. –

+0

あなたは正しいです、私は文字列に3を回したことに気付かなかった、今動作します、あなたが '[3、33、333]'のような配列を持っていてもこれは動作しますか? – Jordash

1

のために働くことは、別のテーブルで会社の制限を保存するために、おそらく良いでしょう。 これはまさにRDBMSの目的です。

本当にJSONを使用する必要がある場合は、おそらく解析する必要があります。ポストグルで利用できるJSON関数がいくつかありますが、配列の手間のように思えますし、SQLを使ってデータをクエリすることもできません。

CREATE TABLE t_user (
    id SERIAL     PRIMARY KEY NOT NULL, 
    name CHARACTER VARYING(256) NOT NULL 
); 

CREATE UNIQUE INDEX t_user_idx ON t_users(name); 

CREATE TABLE t_company (
    id SERIAL     PRIMARY KEY NOT NULL, 
    name CHARACTER VARYING(256) NOT NULL 
); 

CREATE UNIQUE INDEX t_company_idx ON t_company(name); 

CREATE TABLE t_company_restriction (
    id   SERIAL PRIMARY KEY NOT NULL, 
    id_company integer NOT NULL REFERENCES t_company(id) ON DELETE CASCADE, 
    id_user integer NOT NULL REFERENCES t_user(id) ON DELETE CASCADE 
); 

CREATE UNIQUE INDEX t_company_restriction_idx ON t_company_restriction(id_company, id_user); 

INSERT INTO t_user(name) VALUES ('Bill'); 
INSERT INTO t_user(name) VALUES ('Fred'); 

INSERT INTO t_company (name) VALUES ('Company 1'); 
INSERT INTO t_company (name) VALUES ('Company 2'); 
INSERT INTO t_company (name) VALUES ('Company 3'); 
INSERT INTO t_company (name) VALUES ('Company 4'); 

INSERT INTO t_company_restriction (id_user, id_company) 
SELECT u.id, c.id FROM t_user u, t_company c 
WHERE u.name = 'Bill' AND c.name = 'Company 1'; 

INSERT INTO t_company_restriction (id_user, id_company) 
SELECT u.id, c.id FROM t_user u, t_company c 
WHERE u.name = 'Bill' AND c.name = 'Company 2'; 

INSERT INTO t_company_restriction (id_user, id_company) 
SELECT u.id, c.id FROM t_user u, t_company c 
WHERE u.name = 'Fred' AND c.name = 'Company 3'; 

INSERT INTO t_company_restriction (id_user, id_company) 
SELECT u.id, c.id FROM t_user u, t_company c 
WHERE u.name = 'Fred' AND c.name = 'Company 4'; 

SELECT u.name 
FROM t_user u, t_company c, t_company_restriction cr 
WHERE c.name = 'Company 1' 
AND c.id = cr.id_company 
AND u.id = cr.id_user;