Nat*_*iss 18 postgresql null select
考虑这个选择语句:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Run Code Online (Sandbox Code Playgroud)
它返回query_id带有值的列1以及玩家的其他列。
如何将一个至少让上面的SQL回报query_id的1,即使选择,反而找不到行那场比赛?
顺便说一句,它是 PostgreSQL 8.4。
a_h*_*ame 24
SELECT col1,
col2,
col3,
1 AS query_id
FROM players
WHERE username='foobar'
union all
select null,
null,
null,
1
where not exists (select 1 from players where username = 'foobar');
Run Code Online (Sandbox Code Playgroud)
或者作为替代方案(可能更快,因为不需要第二个子选择):
with qid (query_id) as (
values (1)
)
select p.*,
qid.query_id
from qid
left join players as p on (p.useranme = 'foobar');
Run Code Online (Sandbox Code Playgroud)
您可以将上述内容重写为更“紧凑”的表示:
select p.*,
qid.query_id
from (values (1)) as qid (query_id)
left join players as p on (p.useranme = 'foobar');
Run Code Online (Sandbox Code Playgroud)
但我认为显式 CTE ( with...) 更具可读性(尽管在旁观者眼中总是如此)。
如果您只期望返回一行或零行,那么这也可以:
SELECT
max(col1) col1,
max(col2) col2,
1 AS query_id
FROM
players
WHERE
username='foobar';
Run Code Online (Sandbox Code Playgroud)
如果没有找到任何行,这将返回除 query_id 之外的所有值都为 null 的一行。