我在 PostgreSQL 数据库中有下表:
CREATE TABLE maclist (
username character varying,
mac macaddr NOT NULL,
CONSTRAINT maclist_user_mac_key UNIQUE (username, mac)
);
我需要一种方法来检查 MAC 地址是否已分配给用户,或者用户根本没有分配 MAC 地址。基本上我需要一个查询,如果所有条件都为真或没有条件为真,即不是 XOR b ,则返回行。
编辑: 示例:
username | mac
john | 11:22:33:44:55:66
john | 11:22:33:44:55:67
doe | 11:22:33:44:55:68
如果我查询:
username = john, mac = 11:22:33:44:55:66 -> true, 1 whatever...
username = john, mac != 11:22:33:44:55:66 -> 0, null or nothing...
username = jane, mac = no matter what except john's or doe's -> true, 1 whatever...
username = jane, mac = john's or doe's -> 0, null or nothing...
我需要true
在两个条件下:
- 该(用户,mac)组合有一行。没有行
- 对于该用户并且该 mac 没有行
到目前为止,我得到了这个:
SELECT yes
FROM
(SELECT 1 AS yes) AS dummy
LEFT JOIN maclist ON (username = 'user'
OR mac = '11:22:33:44:55:66')
WHERE ((username = 'user'
AND mac = '11:22:33:44:55:66')
OR (username IS NULL
AND mac IS NULL);
它可以工作,但在我看来就像一个 hack,而且随着数据库的增长,我也不知道这个查询的性能。我的问题是是否有更好的方法来做到这一点。