嵌套SQL查询搜索错误的表(postgreSQL)

时间:2017-10-29 19:43:16

标签: sql postgresql casting inner-join

我有两张桌子:

  • devices :( id(int),type(int))
  • devices_log :( id(int),device_id(int)(FK),data(string),date(string))

类型是 1到10 之间的数字,数据列应该是 1到100 之间的数字(" 1",.. 。," 100")或" emptyX" X 表示来自&#34的所有字符; a&# 34;到" z"

具有类型9的设备在数据列中始终具有数字。

我需要更新所有"类型9" 设备的数据字段 有一个大于50的数据,所以==> data = data / 2.

我开始使用INNER JOIN

select l.id 
from devices_log l 
inner join (select id from devices where type = 9) d on (l.device_id = d.id) 

此语句返回"类型9"的所有日志。设备,但当我添加where条件时:

select l.id 
from devices_log l 
inner join (select id from devices where type = 9) d on (l.device_id = d.id) 
where cast(data as INTEGER) > 50 

我收到了这个错误:

  

错误:整数的输入语法无效:" emptyG"

我也尝试了很多导致同样错误的陈述:

select id
from devices_log 
where device_id in (select id from devices where type = 9) 
and cast(data as integer) > 50

select id from
(
  select id, device_id, cast (devices_log.data as integer) as int_data 
  from devices_log 
  join devices on (devices_log.device_id = devices.id
) and type = 9) ccs where ccs.int_data > 50

有什么建议吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

SQL查询描述结果集,而不是正在采取的具体步骤。我实际上认为这个问题没有出现在Postgres中(我在其他数据库中看到过)。我会从这个版本开始:

select l.id
from devices_log l inner join
     devices d 
     on l.device_id = d.id
where d.type = 9 and cast(l.data as INTEGER) > 50 ;

如果这不能解决问题,那么您可以使用case中的where解决此问题:

select l.id
from devices_log l inner join
     devices d 
     on l.device_id = d.id
where d.type = 9 and
      (case when d.type = 9 then cast(l.data as INTEGER) end) > 50 ;

除非条件为真,否则case不应评估then