每天一个比较有文化的sql语句4

关于case when

 SELECT
        a.productId,
        a.productCode,
        a.productName,
        b.productLineName,
        c.seqNo,
        (
        CASE
        WHEN (
        c.useId = #{templateId, jdbcType=VARCHAR}
        ) THEN
        1
        ELSE
        0
        END
        ) isSelected
        FROM
        pf1003 AS a
        LEFT JOIN pf1004 AS b ON a.productLineId = b.productLineId
        LEFT JOIN pf1006 AS c ON a.productId = c.productId and c.useId=#{templateId,jdbcType=VARCHAR}
        WHERE a.productLineId=#{productLineId, jdbcType=VARCHAR}
        ORDER BY seqNo ASC

1.case when then   当case后边有东西才能类似于switch  不然就相当于跟后边的then else end组成一个三目运算符

2.当字段未定义,会造成 unknown column in field list

如图  unknown column 'source' in field list

 

3.可以参考上一篇博客,用内联视图解决

  SELECT attrId,source,
            (case source
            when '01' THEN CONCAT('部件-',(select partName from pf1002 where partId= sourceIdPart))
            when '02' THEN CONCAT('基础产品-',(select productName from pf1003 where productId= sourceIdProduct))
            ELSE '自定义'
            END) sourceName,
        FROM (
               (CASE WHEN EXISTS
                 (select sourceId from pf1008 where  pf1008.attrId = pf1001.attrId AND pf1008.useId = #{useId, jdbcType=VARCHAR} and pf1008.source="01")
                 THEN "01" ELSE
                 (case when EXISTS
                 (select sourceId from pf1008 where  pf1008.attrId = pf1001.attrId AND pf1008.useId = #{useId, jdbcType=VARCHAR} and pf1008.source="02")
                  THEN "02" else "03" END )
                 END ) source
                FROM	pf1001
        ) a
     

4.左连接

pf1003是左表(产品表),productId是pf1003主键

pf1006是产品使用表,useId是使用者id也就是产品模板Id

遇到问题,当一个产品被多个模板使用,下边查询的结果集(不加圈中and时)也会返回多条

原因:把产品基本信息表中每一行,去使用表中找ID与他想等的记录   使用表中一个产品ID被多个模板使用,那肯定会返回多条  左表字段:右表字段=1:多时,左连接数据就会多于想要查找的数据

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值