为了账号安全,请及时绑定邮箱和手机立即绑定

SQL:从可能在另一个表中的列中获取值

SQL:从可能在另一个表中的列中获取值

潇潇雨雨 2022-01-18 16:23:04
我正在工作中进行重构,并将一列从一个表移到另一个表。有一个表格代表一个架子static.connected_shelf(上面有 iot 设备),还有一个表格代表 devices static.iot_devices。现在,有新设备未安装在架子上,因此必须将属性iot_device_type_fk从static.connected_shelf移至static.iot_devices。为了防止在尝试访问此属性时出现竞争条件,我需要修改我的查询,因此当它在其中搜索设备类型static.iot_devices但该列不存在时(在该环境中尚未发生重构),测试不会失败,而是返回static.connected_shelf并从那里获取价值。下面是一个非常简单的查询示例:    query = """SELECT c.pk connected_shelf_fk, i.iot_device_type_fk  device_type_fk, i.pk device_fk                FROM static.connected_shelf c                JOIN static.iot_devices i ON c.pk = i.connected_shelf_fk                WHERE i.pk = %(device_id)s"""     cursor.execute(query, {'device_id': device_id})所以在这里,我已经修改了查询,所以它iot_device_type_fk在static.iot_devices. 我如何确保如果该表中不存在该列,我将从中获取它static.connected_shelf?
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

我希望值在两个表中,NULL表中的值尚未分配。如果是这样:


SELECT c.pk as connected_shelf_fk,

       COALESCE(i.iot_device_type_fk, c.connected_shelf) as iot_device_type_fk,

       i.pk as device_fk,

FROM static.connected_shelf c JOIN

     static.iot_devices i

     ON c.pk = i.connected_shelf_fk

WHERE i.pk = %(device_id)s

如果该列确实不存在,您可以执行以下操作:


SELECT c.pk as connected_shelf_fk,

       (SELECT iot_device_type_fk  -- no alias!

        FROM static.iot_devices i2

        WHERE i2.pk = i.pk

       ) as iot_device_type_fk,

       i.pk as device_fk,

FROM static.connected_shelf c JOIN

     static.iot_devices i

     ON c.pk = i.connected_shelf_fk

WHERE i.pk = %(device_id)s

子查询将iot_device_type_fk首先查找 iniot_devices然后 in connected_shelf。


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信