PostgreSQLデータベースに次のテーブルがあります。
CREATE TABLE maclist (
username character varying,
mac macaddr NOT NULL,
CONSTRAINT maclist_user_mac_key UNIQUE (username, mac)
);
MACアドレスがユーザーに割り当てられているかどうか、またはユーザーにMACアドレスがまったく割り当てられていないかどうかを確認する方法が必要です。基本的に、すべての条件が真であるか、条件が真でない場合、つまりXORではない場合に行を返すクエリが必要です。
編集: 例:
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
2つの条件の下で必要です:
- その(ユーザー、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);
それは機能しますが、私にはハックのように見えます。また、データベースが大きくなるにつれて、このクエリのパフォーマンスについてもわかりません。私の質問は、これを行うためのより良い方法があるかどうかです。