假设我有一个名为 people
的表,具有各种属性
- 名字
- 姓氏
- 年龄
- 电话
- 电子邮件
- 地址
- ...
我想做一个返回所有people
的查询,但是,在特定条件下(单独的子查询),我希望将 select 语句的某些列设置为 null编辑目的。
所以,假设我有基本查询:
SELECT first_name, last_name, age, phone, address
FROM people;
这将返回一个类似于以下内容的表:
|first_name|last_name|age|phone|address |
------------------------------------------------
|Joe |Someone |12 |123 |1234 Somewhere|
|Bob |Other |45 |982 |4321 Somewhere|
我希望能够做这样的事情:
SELECT
first_name,
last_name,
if(people.field IN (
SELECT other_table.some_id FROM other_table WHERE other_table.field = 'is good')
)
age, phone, address
else
NULL
FROM people;
我想要的结果是:
|first_name|last_name|age |phone|address |
------------------------------------------------
|Joe |Someone |12 |123 |1234 Somewhere|
|Bob |Other |NULL |NULL |NULL |
这可能吗?
最佳答案
应该可以通过将子查询放在LEFT JOIN
中来解决这个问题。然后使用 CASE
在 SELECT
将输出列设置为 NULL
子句当需要时:
SELECT
p.first_name,
p.last_name,
CASE WHEN s.some_id IS NOT NULL THEN p.age END AS age,
CASE WHEN s.some_id IS NOT NULL THEN p.phone END AS phone,
CASE WHEN s.some_id IS NOT NULL THEN p.address END AS address
FROM people p
LEFT JOIN other_table s ON s.some_id = p.field AND s.field = 'is good'
您需要注意的是连接的基数。。如果other_table
中有几条记录匹配单个people
记录,那么您将得到重复的输出行。为了避免这种情况,一种解决方案是使用 SELECT DISTINCT
,或者通过添加子句 GROUP BY p.first_name, p.last_name, p.age, p.phone, p.address
来打开聚合在查询末尾。
关于SQL - 根据条件将某些列设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54488787/