SQL测试值不存在

时间:2017-12-11 19:25:55

标签: sql

我正在尝试修改现有代码,以便在2种情况属实时选择CASE结果。业务规则已经改变,因此下面的代码可以工作,它刚刚变得不完整。 下面是一个实际代码片段,用于测试特定发票中的任何订单项是否具有“CCC-OUT”的ITMCLSCD。规则已更改,因此现在,所有订单项都需要具有“CCC-OUT”的ITMSLSCD。 所以现在我需要测试“CCC-OUT”的存在以及行项目集中是否缺少任何其他ITMSLSCD。
有人能指出我正确的方向吗?

由于

    SELECT DISTINCT
    OH.SOPNUMBE HSOPMNBR,
    OH.INVODATE INVODATE,
    OH.ORIGNUMB ORIGNUM,
    OH.CUSTNMBR CUSTOMER,
    CASE    WHEN 'CCC-OUT' IN (SELECT LEFT(IV.ITMCLSCD,7) 
            FROM IV00101
            INNER JOIN SOP10200 OL ON OH.SOPNUMBE = OL.SOPNUMBE
            WHERE OH.SOPTYPE = 3 
            AND OH.PSTGSTUS = 0 
            AND OH.VOIDSTTS = 0 
            AND OH.BACHNUMB <>'DO NOT POST')
THEN 'THIRD PARTY SERVICES'
        ELSE 'COMPANY SERVICES'
    END  TRANSTYPE,
    UD.USRTAB09
FROM SOP10100 OH
INNER JOIN SOP10200 OL ON OH.SOPNUMBE = OL.SOPNUMBE
INNER JOIN IV00101 IV ON OL.ITEMNMBR = IV.ITEMNMBR
INNER JOIN SOP10106 UD ON OH.SOPNUMBE = UD.SOPNUMBE
WHERE OH.SOPTYPE=3
AND OH.PSTGSTUS = 0
AND OH.VOIDSTTS = 0
AND OH.BACHNUMB <>'DO NOT POST'

1 个答案:

答案 0 :(得分:0)

到目前为止,您至少需要一个LEFT(IV.ITMCLSCD,7) = 'CCC-OUT'。现在您希望至少有一个LEFT(IV.ITMCLSCD,7) = 'CCC-OUT'加上LEFT(IV.ITMCLSCD,7) <> 'CCC-OUT'

换句话说,无论您是查看最小值还是最大值,都是'CCC-OUT',因为所有值都是'CCC-OUT': - )

写这个的一种方法:

WHEN 'CCC-OUT' = 
(
  SELECT 
    CASE WHEN MIN(LEFT(IV.ITMCLSCD,7)) = MAX(LEFT(IV.ITMCLSCD,7))
      THEN MIN(LEFT(IV.ITMCLSCD,7))
      ELSE 'MISMATCH'
    END
  FROM IV00101
  INNER JOIN SOP10200 OL ON OH.SOPNUMBE = OL.SOPNUMBE
  WHERE OH.SOPTYPE = 3 --Invoice
  AND OH.PSTGSTUS = 0 --Unposted
  AND OH.VOIDSTTS = 0 --Not Voided
  AND OH.BACHNUMB <>'DO NOT POST'
)
THEN '3PARTY SERVICES'

(您甚至可以删除ELSE分支;默认为NULL,它的工作方式相同。)