首页 > 解决方案 > postgresql case语句获取另一列值

问题描述

我有三个表:入侵、警报和闭路电视,我想使用案例语句来获取对象的注册编号及其位置,具体取决于它是闭路电视还是触发入侵表中入侵事件的警报。

这是入侵表:

在此处输入图像描述

这是报警表: 在此处输入图像描述

CCTV 表类似于警报表,这是我的代码:

SELECT
    ALARM_ID
,   CCTV_ID
,   CASE
        WHEN
            ALARM_ID    IS  NULL
        AND CCTV_ID IS  NOT NULL
        THEN
            (
                SELECT
                    REGISTRATION_NUMBER, LOCATION
                FROM
                    REMOTE_SECURITY.ALARMS
                WHERE
                    REMOTE_SECURITY.INTRUSIONS.ALARM_ID =   REMOTE_SECURITY.ALARMS.ALARM_ID
            )
        WHEN
            ALARM_ID    IS  NOT NULL
        AND CCTV_ID IS  NULL
        THEN
            (
                SELECT
                    REGISTRATION_NUMBER, LOCATION
                FROM
                    REMOTE_SECURITY.CCTVS
                WHERE
                    REMOTE_SECURITY.INTRUSIONS.cctv_id  =   REMOTE_SECURITY.CCTVS.CCTV_ID
            )
        ELSE
            'not running'
    END
FROM
    REMOTE_SECURITY.INTRUSIONS

我希望最终输出是一个包含 2 列的表:位置和注册编号。(我不需要知道它是闭路电视还是警报器)

任何帮助将不胜感激!

标签: postgresql

解决方案


那么为什么不这样做:

SELECT location, registration_number FROM alarms
  WHERE alarm_id IN (SELECT alarm_id FROM intrusions)
UNION
SELECT location, registration_number FROM cctvs
  WHERE cctv_id IN (SELECT cctv_id FROM intrusions)

这应该基本上等同于您的代码,只是更简洁,更接近您声明的意图

如果您确实打算从intrusions表中获取信息,那么可能类似于:

SELECT intrusion_id, datetime_occurred,
  COALESCE(a.location, c.location) AS location,
  COALESCE(a.registration_number, c.registration_number) AS registration_number
FROM intrusions i
  LEFT JOIN alarms a ON i.alarm_id = a.alarm_id
  LEFT JOIN cctvs c ON i.cctv_id = c.cctv_id

不知道你在做什么来得到一个语法错误,它在我做之后对我有用:

create temp table intrusions (intrusion_id serial primary key, datetime_occurred timestamp, alarm_id int, cctv_id int);
create temp table alarms (alarm_id serial primary key, location text, registration_number text);
create temp table cctvs (cctv_id serial primary key, location text, registration_number text);

如果您在问题中包含此类代码,它会有所帮助!如果你让其他人更容易,你会得到更多的答案……</p>


推荐阅读