问题描述
在工作的时候碰到一个需求,是一个仓库管理系统的出入库调整单的查询。
显示的时候有一个主单,同时需要查询详单数据,但是主单既可以和出库单关联,也可以和入库单关联,所以在查询的时候就需要判断详单类型,从而查询不同的数据库表。
解决思路
按条件查询我第一时间就想到了使用 Case When来判断,定义一个变量来作为判断条件,根据不同的值来执行不同的When就可以,但是最后缺遇到了一个问题。
问题出现
在使用Case When的时候,我们接口需要返回Json对象,使FOR JSON PATRH 将返回的数据变成json对象,但是测试的时候,却发现When里面的查询结果虽然生成了json数据,但是却没有变成json对象,而是json对象转译成了字符串,这样我们没有办法处理数据,就很麻烦。
问题解决
在和同事的讨论下,发现可以不使用Case When来进行判断,这里我们使用的是Union联合查询,我们将出入库两种情况进行联合查询,然后将判断条件作为Where的条件,这样联合查询只会执行其中一个,同时也可以生成json对象了。完美的解决问题。
问题总结
这可能是SQLserver中一个小坑,因为数据库默认Case When 中都是字符串,但是又可以进行查询,所以查询出来的结果都是字符串,无论怎么操作,最后生成的一定是字符串。同时我在处理这个问题的时候也钻了牛角尖,一直在思考如何解决变成字符串的这个问题,没有跳出Case When思考其他的判断方式,所以遇到问题一定要多思考几种解决方案。