簡體   English   中英

PostgreSQL選擇*其中列包含數組值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM