interbase数据表行变列的问题!!请版主帮忙!!急!!

xlzxc 2003-09-29 11:44:10
具体情况是这样的:
现在有一已知表他tab_1:
id name value
--------------------
1 ss 8
1 dd 9
1 ff 10
在执行一段select以后,我要得把每一行的记录都边成列,如下 tab_2:
id ss dd ff
-------------------------
1 8 9 10

在SQL server里面我用case when实现了,但是现在在interbase里面不支持case when

请教高手因该怎么做啊!!!一定要给出完成的SQL语句啊!!
...全文
96 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlzxc 2003-10-03
  • 打赏
  • 举报
回复
康老大,多谢支持,接分
xlzxc 2003-10-03
  • 打赏
  • 举报
回复
康老大,过节好!

问题解决了!
我测试以后发现,如果同时装了firebird和interbase以后就case语句怎么也不能通过,如果把interbase卸了,单独使用firebird就没有有问题,可能是interbase open source版不支持case的原因吧(我是这样想的,试了单独使用interbase的情况,case 语句不能用)。
还有在单独的firebird的环境下下面的语句也是可以通过的
select max(id) as ID ,如果要把例名转化成中文就要用这样的:select max(id) as "序号"
CuteBit 2003-10-02
  • 打赏
  • 举报
回复
hi,xlzxc 节日快乐
可能是你的数据库端和客户端的 SQLDialect 是 3.
这样双引号不是问题了~
xlzxc 2003-10-01
  • 打赏
  • 举报
回复
康老大,多谢支持!!
现在10.1放假,我在家里用win98的机器装了BCB6+SP1~4,然后测试IBQuery如下,
select max(id) as "ID",max( case when name='夏粮'then valu end ) as "NAME" from tab_1

通过了,我都不知道是为什么!!我现在准备在WIN2K下面测试。

希望不是OS的问题!!
xlzxc 2003-09-30
  • 打赏
  • 举报
回复
是bcb有问题吗???
xlzxc 2003-09-30
  • 打赏
  • 举报
回复
在isql.exe下面使用上面的SQL语句都OK了,但是我在BCB6的IBdataset里面用就是在case后面的都是unknown
请斑竹在BCB6里面试一下!
CuteBit 2003-09-30
  • 打赏
  • 举报
回复
hi,xlzxc
应该是 as "ss" 的问题.
双引号标注字段是 fb 才加入的,但是需要 SQLDialect3 才行.

你只要把 as "ss" 改成 as ss 就可以了.

BTW: 你应该把出错信息提供出,它的完整出错在我的机器上是:
Token unknown -lineX -charX
"ss"
xlzxc 2003-09-29
  • 打赏
  • 举报
回复
我先下一个RC6试一下!
CuteBit 2003-09-29
  • 打赏
  • 举报
回复
hi,,xlzxc
在我的 fb1.5 rc6 下
select
max(case when not(id is null) then 1 else 0 end) as "ss"
from Tab_1
或者
select
max(case when id > 100 then 1 end) as "ss"
from Tab_1
都是通过的.
CuteBit 2003-09-29
  • 打赏
  • 举报
回复
hi,,xlzxc
select
max(case when not(id is null) then 1 else 0 end) as "ss"
-- ~~~~~~~~~~~~~~~~~
from Tab_1
xlzxc 2003-09-29
  • 打赏
  • 举报
回复
奇怪了!只要在case后面出现的东西都是unknown,我倒!!
erickleung 2003-09-29
  • 打赏
  • 举报
回复
select max(
case id
when ss then 1
else 0
end
) as "ss"
from Tab_1
xlzxc 2003-09-29
  • 打赏
  • 举报
回复
select max( case when id =1 then name end ) from tab_1
在fb 1.5 rc4 下面不好用,case 是认识了,但是不认识when!!!
xlzxc 2003-09-29
  • 打赏
  • 举报
回复
谢谢斑竹,我现在试一下,你等一下,不要走啊!
CuteBit 2003-09-29
  • 打赏
  • 举报
回复
>> 错误是token unknown when,说when不认识!!
哦,对不起,是 fb1.5 才支持 case 的。

>>select name as "名称" from tab_1,但是fb是可以的!
好像是 fb 小组在 fb1 中加入 as 的,为了支持 SQL92
xlzxc 2003-09-29
  • 打赏
  • 举报
回复
interbase还有一个语法不支持,就是
select name as "名称" from tab_1,但是fb是可以的!
xlzxc 2003-09-29
  • 打赏
  • 举报
回复
我的case 语句和你写的是一样的!
xlzxc 2003-09-29
  • 打赏
  • 举报
回复
我在fb中也试了啊

错误是token unknown when,说when不认识!!
CuteBit 2003-09-29
  • 打赏
  • 举报
回复
哦,对不起,没看清你的问题。
你的问题就是用存储过程也不好实现,因为行数是动态的。
有两个办法实现:
#1 存储过程不能实现动态的列。但从业务上看,很少出现列是完全不可预测的情况。一般是在一个固定集合中。所以可以将存储过程的返回列定义全部集合,然后根据情况依次填写数据到相应的列。方法实现虽然不巧妙,但能从业务方向看问题,也算巧妙了 :))
#2 升级 ib 到支持 case 语句的版本(我不知道 ib7 是否支持),但 fb1 支持。

BTW:我不知道 ib 是否真的不支持 case 还是你的 case 语法写错了。case 语法:
CASE WHEN name = 'AA' THEN NULL ELSE name END
CuteBit 2003-09-29
  • 打赏
  • 举报
回复
我以前是在存储过程中完成的,嗯。。用存储过程能完成很复杂的转换,但是存储过程编写不好调试。
后来的 fb 就支持 case 语句了。用起来很方便。

2,209

社区成员

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

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