有难度的SQL语句,类似高级语言的setch...case,在线求解.

tongguanyi 2006-03-03 09:10:12
表:stateData
sbid state1 state2 ... state22
00001 1 0 1
00001 0 0 0
表:alarm
sbid alarmName channel [while] [value]
00001 A类报警 S1 = 1
00001 A类报警 S22 = 1

说明:根据alarm中的条件来查询stateData里的数据,上面的例子可写为:
select*from stateData where state1 = 1 and state22 = 1
请问怎么根据channel的值来写SQL语句?
...全文
138 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
MajorVon 2006-03-06
  • 打赏
  • 举报
回复
这个数据库是新的,还是老的,如果是新的,请删除掉,重新再来,不要成为以后的炸弹,
老的只能通过存储过程,或业务逻辑把它处理好
sboom 2006-03-04
  • 打赏
  • 举报
回复
分开2次查询

declare @chanel varchar(100)
declare cursor @c1 for select * from alarm

open @c1

fetch channel into @chanel from @c1
while @@fetch_state==0
begin
switch(@chanel)
case 'S1'
select * from stateData where state1='..';
end
一条晚起的虫 2006-03-04
  • 打赏
  • 举报
回复
存储过程
handsomerun 2006-03-03
  • 打赏
  • 举报
回复
或者用联合查询

select a.* from a inner join b on a.sbid=b.sbid where b.channel='S22'
teli_eurydice 2006-03-03
  • 打赏
  • 举报
回复
说完了
lzzqqq 2006-03-03
  • 打赏
  • 举报
回复
查询channel为S22的状态数据

select a.* from stateData a,alarm b where a.sbid=b.sbid and b.channel='S22'
tongguanyi 2006-03-03
  • 打赏
  • 举报
回复
好象可以用变量来作为字段名查询,但记不得语法了.
那样更方便
handsomerun 2006-03-03
  • 打赏
  • 举报
回复
有点明白你的意思了

好像不能用swith case这样的
因为你的查询条件不同

得用if else这样来判断
tongguanyi 2006-03-03
  • 打赏
  • 举报
回复
我写的有错误:
SELECT COUNT(*) FROM statedata where shebeiid = @id and
CASE
WHEN @channel='S1' THEN state1
END
handsomerun 2006-03-03
  • 打赏
  • 举报
回复
难道是想要的是一一对应吗
就是表stateData中第x条记录对应表alarm中的第x条

如果查出的是stateData第x条,那么得到的结果是alarm中的第x条,是这个意思吗

如果是这样,可以给两个表各添加一个序号的字段,然后把两个表的序号字段连接起来,
tongguanyi 2006-03-03
  • 打赏
  • 举报
回复
关键是要由S1对应出字段state1,S22对应state22
tongguanyi 2006-03-03
  • 打赏
  • 举报
回复
我是说根据00001 A类报警 S1 = 1
记录(作为条件),去查询stateData表,得出的记录肯定是:

sbid state1 state2 ... state22
00001 1 0 1
handsomerun 2006-03-03
  • 打赏
  • 举报
回复
select*from stateData where state1 = 1

查出来的是

sbid state1 state2 ... state22
00001 1 0 1


怎么会是
00001 A类报警 S1 = 1
呢??
tongguanyi 2006-03-03
  • 打赏
  • 举报
回复
不是那意思,我都不知道怎样表达了.
比如说这条记录:
00001 A类报警 S1 = 1
那么应该查询:
select*from stateData where state1 = 1
而:00001 A类报警 S22 = 1
应该查询
select*from stateData where state22 = 1
handsomerun 2006-03-03
  • 打赏
  • 举报
回复
你这个channel 是什么类型的字段阿,是字符窜的吗
那就是

select*from alarm where channel = 'S1'

是这个意思吗,实在是没看董,真不好意思
tongguanyi 2006-03-03
  • 打赏
  • 举报
回复
sorry,我没说清楚,意思是:
如果alarm中的channel为S1,那么应该select*from statedata where state1 = '..'查询,
如果是S22,就应该select*from statedata where state22 = '..'查询.

4,017

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧