[英]PostgreSQL select * where column contains array value
我有一個像這樣的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
類型
我究竟做錯了什么?
嘗試<@
包括運算符 :
<@左側JSON路徑/值條目是否包含在右側JSON值的頂層?
SELECT * FROM users WHERE '3' <@ users.companyrestrictions
ANY僅適用於數組
最好將公司限制存儲在另一個表中。 這正是RDBMS的目的。
如果您確實需要使用JSON,則可能必須對其進行解析。 postgres中可能提供了一些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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.