-
- SQL中CASE的变态用法
- Weather:雾转阵雨,东南风4-5级转南风4-5级,(20~25)℃
- 2008-07-09
先把这段SQL放上再说
select top 100
scNumber,curRec,
(case curRec when 1 then spname when 2 then trackNum when 0 then 'none' end) AS SPNAME
from dba.ast_scNumber a join dba.spname b
on b.spnumber=a.spnumber and
b.spnumber =(case curRec when 1 then a.spnumber else b.spnumber end)
where datediff(day,recTime,'2008-7-7')=0
order by scid之前只知道在SELECT后可以用CASE WHEN THEN ELSE END语句(如上第三行),后来又发现在WHERE或ON条件子句中也是可以用的(如上第六行),但是在条件子句中怎么用,就成了个大问题了,因为CASE选择名返回的只是一个字段或是值,没办法返回条件句,如下句就无效
where (case curRec when 1 then a.spnumber=b.spnumber else 1=1 end)
或是
where a.spnumber(case curRec when 1 then =b.spnumber else not is null end)
这两句都不好用,想了好几分钟,其它的条件下(不进行a.spnumber字段判断的情况下,让此字段=自己不就行了 :)
上段代码是在sybase下调试通过的,在别的库下没试过,不过应该像SQL SERVER,DB2这样的库应该都是可以了,而ORACLE和MYSQL这样的库,就不知道了,愿意的同学自己试下。
实际上,下面这段代码才是俺里的程序里写的,用于DB2的
strSql.Append("SELECT ").Append(vbCrLf)
strSql.Append(" FBZ11P.Z1RKCD,").Append(vbCrLf)
strSql.Append(" FBZ11P.Z1SSDT,").Append(vbCrLf)
strSql.Append(" FBZ11P.Z1SBSB,").Append(vbCrLf)
strSql.Append(" FBZ11P.Z1SKJK,").Append(vbCrLf)
strSql.Append(" (CASE LEFT(FBZ11P.Z1SBSB,1)").Append(vbCrLf)
strSql.Append(" WHEN 'S'").Append(vbCrLf)
strSql.Append(" THEN CMSENMP.I1FUN1").Append(vbCrLf)
strSql.Append(" WHEN 'T'").Append(vbCrLf)
strSql.Append(" THEN 'トラック'").Append(vbCrLf)
strSql.Append(" WHEN 'W'").Append(vbCrLf)
strSql.Append(" THEN '貨車トラック'").Append(vbCrLf)
strSql.Append(" END) AS SBNAME").Append(vbCrLf)
strSql.Append(" FROM ").Append(vbCrLf)
strSql.Append(zaikoDb).Append(vbCrLf)
strSql.Append(" JOIN CMSENMP").Append(vbCrLf)
strSql.Append(" ON CMSENMP.I1SNCD=FBZ11P.Z1SBSB AND").Append(vbCrLf)
strSql.Append(" CMSENMP.I1SNCD=").Append(vbCrLf)
strSql.Append(" (CASE LEFT(FBZ11P.Z1SBSB,1)").Append(vbCrLf)
strSql.Append(" WHEN 'S'").Append(vbCrLf)
strSql.Append(" THEN FBZ11P.Z1SBSB").Append(vbCrLf)
strSql.Append(" ELSE CMSENMP.I1SNCD END)").Append(vbCrLf)
strSql.Append(" WHERE FBZ11P.Z1RKCD = ?Z1RKCD").Append(vbCrLf)
strSql.Append(" AND FBZ11P.Z1SSDT > ?Z1KANR1").Append(vbCrLf)
strSql.Append(" AND FBZ11P.Z1SSDT < ?Z1KANR2").Append(vbCrLf)
strSql.Append(" AND FBZ11P.Z1SBSB = ?Z1SBSB").Append(vbCrLf)
strSql.Append(" AND (FBZ11P.Z1ZKSN = '0' OR FBZ11P.Z1ZKSN = '1')").Append(vbCrLf)
strSql.Append(" ORDER BY FBZ11P.Z1SSDT,FBZ11P.Z1SBSB,FBZ11P.Z1SKJK").Append(vbCrLf)-
Views(6335) | Comments(1) |
In:
web develop
|
(07/07)
SQL の CASE 式って知ってますか
[SQL中CASE的变态用法]的回复
-
柠檬园主
于
2009-01-07 11:35:56
发表 |
IP:116.3.199.*
insert dba.AST_MAS27PF(asssumid,spnumber,scNums,scQty,nowQty,lostRate,doMonthDate,doMonthEndDate) select asssumid,spnumber,count(scNumber) as scNums,sum(SumScQty) as TotalScQty,sum(SumNowQty) as TotalNowQty,(TotalScQty-TotalNowQty)/TotalScQty as lostRate,'2009-01-01','2009-01-06' from (select spnumber,asssumid,scNumber,isnull(sum(nowQty),0) as SumNowQty,isnull(sum(sendQty),0) as SumScQty from dba.AST_scNumber a where curRec=3 and datediff(day,recTime,'2009-01-01')<=0 and datediff(day,recTime,'2009-01-06')>=0 group by spnumber,asssumid,scNumber) as newdb group by spnumber,asssumid order by spnumber
