关于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:多时,左连接数据就会多于想要查找的数据