如何简洁地检查子查询是否只有一个不同的结果和指定的值?

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- 没有重复

Erw*_*ter 8

简洁,快速(尤其是多行),我最喜欢的关于可读性的,也可以与欺骗者一起使用:

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


ype*_*eᵀᴹ 5

@Erwin 答案的变体。完全没有COUNT(),只有MIN()MAX()。大表和(不是你的情况)重复可能会更有效val

SELECT MIN(val) = 1 AND MAX(val) = 1 FROM foo;
Run Code Online (Sandbox Code Playgroud)