不在不使用 Case 语句 PLSQL 的条件下

not in condition not working with Case statement PLSQL

NOT IN条件,不行。我在 table

中有这些记录
proj_comp_id proj_no
1050-WE-0005 8661
TOGG0000001 1581
5207-00GAC01AA502 8662

所以它应该为第二个值添加一个错误..但不工作请帮助。下面的代码也为第 1 行和第 3 行添加了错误。


SELECT p.proj_comp_no AS primarykey,
       p.proj_comp_id AS proj_comp_id,
       pr.proj_id     AS proj_id,
       p.proj_no,       
       CASE
         WHEN p.proj_comp_id NOT IN ('5207-%',
                                     '1051-%',
                                     '1050-%',
                                     '1048-%',
                                     '1049-%',
                                     '2006-%',
                                     '5203-%',
                                     '1055-%',
                                     '1056-%',
                                     '1054-%') and p.proj_no NOT like (1581)         
         THEN
          '1TAG_ID does not start with project prefix, pls add project prefix(5207-, 1049-,1048)'       
         ELSE
          'NO ERROR'
       END AS tag_ID_ERROR,       
       p.descr AS descr
  FROM proj_comp p
  LEFT JOIN std_mat_cls l
    ON l.std_mat_cls_no = p.std_mat_cls_no
  LEFT JOIN std_mat b
    ON p.proj_comp_id = b.std_mat_id
  LEFT JOIN proj pr
    ON p.proj_no = pr.proj_no
 WHERE (SELECT m.mat_stat_ext_id
          FROM mat_stat_ext m
         WHERE p.mat_stat_ext_no = m.mat_stat_ext_no) IN ('N', 'P')
   AND b.std_mat_id IS NULL

***    

那一定是因为 IN 在这种情况下不合适。你应该切换到别的东西,例如单独 LIKE 个条件:

否:

WHEN p.proj_comp_id NOT IN ( '5207-%', '1051-%', '1050-%', etc.

是:

 WHEN p.proj_comp_id NOT LIKE '5207-%'
  AND p.proj_comp_id NOT LIKE '1051-%'
  AND p.proj_comp_id NOT LIKE '1050-%'
  etc.

另一种测试方法可以使用 InStr() 函数解决...

WHEN 
    InStr('5207-, 1051-. 1050-, 1048-, 1049-, 2006-, 5203-, 1055-, 1056-, 1054-', SubStr(p.proj_comp_id, 1, 5)) = 0