Jac*_*las 10 postgresql duplication
我发现自己写了以下内容:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
Run Code Online (Sandbox Code Playgroud)
并想知道是否有更简洁的方法而不牺牲太多的可读性。
我找到了一种作为答案发布的方法,但我对此并不完全满意,并且对替代方案非常感兴趣
在这种情况下val是唯一的foo- 没有重复
简洁,快速(尤其是多行),我最喜欢的关于可读性的,也可以与欺骗者一起使用:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Run Code Online (Sandbox Code Playgroud)
返回TRUE/ FALSE.. 或NULL-仅在正好有一行的情况下val IS NULL,因为count()从不返回NULL或没有行。
1由于您的示例,示例中的第二个恰好与第一个相同。
问题中的查询因NULL值而失败。考虑简单的演示:
CREATE TABLE foo (id int, val int);
INSERT INTO foo VALUES (1, 1),(2, NULL);
SELECT 'yes'
WHERE EXISTS(SELECT * FROM foo WHERE val = 1)
AND NOT EXISTS(SELECT * FROM foo WHERE val <> 1);
Run Code Online (Sandbox Code Playgroud)
IS DISTINCT FROM会解决这个问题,但它仍然可能因重复而失败val- 你已经排除了这种情况。
你的回答工作正常。
返回'yes'/无行。
不过,我更喜欢这种较短的形式。不要忘记 PostgreSQL(与 Oracle 不同)有一个正确的booleantype。
SELECT array_agg(val) = array[1] FROM foo;
Run Code Online (Sandbox Code Playgroud)
返回TRUE/ FALSE/ NULL。
@Erwin 答案的变体。完全没有COUNT(),只有MIN()和MAX()。大表和(不是你的情况)重复可能会更有效val:
SELECT MIN(val) = 1 AND MAX(val) = 1 FROM foo;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5547 次 |
| 最近记录: |