SQL - 根据条件将某些列设置为空

标签 sql postgresql

假设我有一个名为 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中来解决这个问题。然后使用 CASESELECT将输出列设置为 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/

相关文章:

mysql合并数据分配相同的ID

mysql - 如何从 ListView 导出数据并保存在数据库中

php - 如何防止PHP中的SQL注入(inject)?

postgresql - 在 View 中使用 hstore 比较转储和恢复 PostgreSQL 数据库失败

python - SQLAlchemy 在执行查询中缓存 now()

sql - 具有计数聚合函数的列表列

sql - postgreSQL 加入并嵌入记录数组

postgresql - 从交易表中查询历史余额数据

mysql - 使用复合主键作为外键

MySQL基于正则表达式的select