我有这个问题:
select last_ddns_update_time
from lu_camera cam
where cam.unit_id='90016980'
and cam.device_id='2051'
and cam.device_id not in (
select device_id
from lu_camera_ext
where unit_id=cam.unit_id
and device_id=cam.device_id)
它目前只返回一个变量(来自一个单元格)。是否可以返回两个变量(一个来自一个单元格,另一个来自查询本身)?
我想要它,如果这部分是真的:
(select device_id
from lu_camera_ext
where unit_id=cam.unit_id
and device_id=cam.device_id)
然后返回值A else返回值B(select last_ddns_update_time, new_value
)。我对SQL比较陌生,所以如果这是一个大型的磨砂问题,我很抱歉。
有点像:
select last_ddns_update_time, new_value from lu_camera cam where cam.unit_id='90016980' and cam.device_id='2051' and cam.device_id
and if (select device_id from lu_camera_ext where unit_id=cam.unit_id and device_id=cam.device_id) set new_value='a'
else set new_value='b'
答案 0 :(得分:0)
您无法从where子句中的表中选择数据。你只是无法访问它们。但是,通过稍微更改您的查询,您可以按照自己的要求进行操作。不要在where子句中使用子选择,而是将其移动到查询的选择部分(WHAT ?!)。没错,您可以在选择中进行子选择。
由于你正在检查cam.device_id是否在你的子选择中,我假设你想要'new_value',如果id在select中,否则你想要last_ddns_update_time。它看起来像这样:
Select isnull((select new_value
from lu_camera_ext
where unit_id=cam.unit_id
and device_id=cam.device_id
and cam.device_id = device_id)
, last_ddns_update_time)
from lu_camera cam
where cam.unit_id='90016980'
and cam.device_id='2051'
所以发生了什么,如果cam.device_id在表中,你正在寻找lu_camera_ext中的新值。如果未使用子选择返回device_id,则返回null。然后isnull评估返回的值。如果你得到null,那么就像往常一样返回last_ddns_update_time。
答案 1 :(得分:0)
等同于If / Else的SQL是CASE关键字。此外,如果您使用"外连接",查询会更容易。试试这个:
select last_ddns_update_time,
CASE WHEN ext.device_id IS NULL THEN 'b' ELSE 'a' END as new_value
from lu_camera cam LEFT JOIN lu_camera_ext ext ON cam.unit_id=ext.unit_id
and cam.device_id=ext.device_id
where cam.unit_id='90016980'
and cam.device_id='2051'