【发布时间】:2012-11-21 09:13:02
【问题描述】:
我在 PostgreSQL 数据库中有下表:
CREATE TABLE maclist (
username character varying,
mac macaddr NOT NULL,
CONSTRAINT maclist_user_mac_key UNIQUE (username, mac)
);
我需要一种方法来检查 MAC 地址是否已分配给用户,或者用户根本没有分配 MAC 地址。基本上,如果所有条件都为真或没有条件为真,我需要一个返回行的查询,即 NOT a 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,而且随着数据库的增长,我也不知道这个查询的性能。 我的问题是是否有更好的方法来做到这一点。
【问题讨论】:
-
请您明确写出您需要结果为true的条件吗?也许是一个逻辑表?或者只是导致 true 的场景的项目符号列表?
-
两个用户可以共享同一个mac地址吗? (在现实生活中,多个用户从多个 mac 地址连接,mac 地址有多个用户从它们连接。)
-
True,因此您可以为每个用户添加多个 MAC。表中的约束在两个字段上,所以用户不是唯一的,如果用户是
NULL,这算作黑名单 MAC(至少这是想法) -
那么,在两个条件下你只想要
true?1.该(用户,mac)组合有一行。2.没有该用户的行并且该 mac 没有行? -
是的。这就是想法。对不起!英语不是我的母语。
标签: sql postgresql select