如何从sql查询中另一个表的其他列中对应于哪个特定值的表中检索那些列

时间:2015-01-09 09:21:15

标签: sql-server

我在数据库中有两个表,即 main.vacuum_status和main_vacuum_analog 。 **

logtime is a common field
两个表中的

。 在main.vacuum_status中有列和st1_vs1_bag1_onoff ..这样有八列到st1_vs1_bag8_onoff。这些列中的一些分别有0或1作为值。在另一个表中有st1_vs1_bag1_rb列,直到st1_vs1_bag8_rb有一些实际类型值。

Condition

现在我想要一个sql查询,它检查st1_vs1_bag1_onoff ..列中的1时,那么另一个表列st1_vs1_bag1_rb的实际类型值应该是dispalyed.ie如果st1_vs1_bag8_onoff为0则不应显示st1_vs1_bag8_rb,如果st1_vs1_bag8_onoff为1,然后显示st1_vs1_bag8_rb sholud的值。

有没有这样的SQL查询??

EDIT 1

通过查看答案,我将我的SQL查询形成为

select 
  case when a.st1_vs1_bag1_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag1_rb ELSE 'Value when 0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag2_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag2_rb else '0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag3_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag3_rb else '0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag4_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag4_rb else '0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag5_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag5_rb else '0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag6_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag6_rb else '0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag7_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag7_rb else '0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag8_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag8_rb else '0' END as st1_vs1_bag1_rb ,

from main_vacuum_status a INNER JOIN main_vacuum_analog c ON a.LOGTIME = c.LOGTIME

但错误正在显示 Incorrect syntax near form

3 个答案:

答案 0 :(得分:1)

根据您提供的信息,您可以执行以下操作:

SELECT 
    CASE WHEN st1_vs1_bag1_onoff = 1 THEN st1_vs1_bag1_rb END AS st1_vs1_bag1_rb
    CASE WHEN st1_vs1_bag2_onoff = 1 THEN st1_vs1_bag2_rb END AS st1_vs1_bag2_rb
    CASE WHEN st1_vs1_bag3_onoff = 1 THEN st1_vs1_bag3_rb END AS st1_vs1_bag3_rb
    CASE WHEN st1_vs1_bag4_onoff = 1 THEN st1_vs1_bag4_rb END AS st1_vs1_bag4_rb
    CASE WHEN st1_vs1_bag5_onoff = 1 THEN st1_vs1_bag5_rb END AS st1_vs1_bag5_rb
    CASE WHEN st1_vs1_bag6_onoff = 1 THEN st1_vs1_bag6_rb END AS st1_vs1_bag6_rb
    CASE WHEN st1_vs1_bag7_onoff = 1 THEN st1_vs1_bag7_rb END AS st1_vs1_bag7_rb
    CASE WHEN st1_vs1_bag8_onoff = 1 THEN st1_vs1_bag8_rb END AS st1_vs1_bag8_rb
FROM main_vacuum_status S
INNER JOIN main_vacuum_analog A
    ON  S.logtime = A.logtime

如果 st1_vs1_bag * _onoff 不是1, st1_vs1_bag * _rb NULL 。 如果要显示默认值,请将其放在 ELSE 部分中,如下所示:

CASE WHEN st1_vs1_bag1_onoff = 1 THEN st1_vs1_bag1_rb ELSE 'Value when 0' END AS st1_vs1_bag1_rb

答案 1 :(得分:1)

您可以执行以下操作:

SELECT LOGTIME
,
,CASE 
    WHEN st1_vs1_bag1_onoff = 1
        THEN st1_vs1_bag1_rb
    ELSE '<No Value>'
    END AS st1_vs1_bag1_rb
,
   .
   .
   .
   .
   .
   .
,CASE 
    WHEN st1_vs1_bag8_onoff = 1
        THEN st1_vs1_bag8_rb
    ELSE '<No Value>'
    END AS st1_vs1_bag8_rb
FROM main.vacuum_status AL1
INNER JOIN main_vacuum_analog AL2 ON AL1.LOGTIME = AL2.LOGTIME

如果这不是你想要的,请告诉我。

答案 2 :(得分:0)

我通过此查询获得了我想要的内容,上述答案都很有用:))

select c.LOGTIME,
  case when a.st1_vs1_bag1_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag1_rb ELSE '0' END as st1_vs1_bag1_rb ,
  CASE when a.st1_vs1_bag2_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag2_rb else '0' END as st1_vs1_bag2_rb ,
  CASE when a.st1_vs1_bag3_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag3_rb else '0' END as st1_vs1_bag3_rb ,
  CASE when a.st1_vs1_bag4_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag4_rb else '0' END as st1_vs1_bag4_rb ,
  CASE when a.st1_vs1_bag5_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag5_rb else '0' END as st1_vs1_bag5_rb ,
  CASE when a.st1_vs1_bag6_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag6_rb else '0' END as st1_vs1_bag6_rb ,
  CASE when a.st1_vs1_bag7_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag7_rb else '0' END as st1_vs1_bag7_rb ,
  CASE when a.st1_vs1_bag8_onoff='0' and a.logtime=c.logtime then c.st1_vs1_bag8_rb else '0' END as st1_vs1_bag8_rb 

from main_vacuum_status a INNER JOIN main_vacuum_analog c ON a.LOGTIME = c.LOGTIME and
c.logtime between '2014-10-10 07:17:00' and '2014-10-10 08:46:00'