1

句の一部である値を正しく返すこのクエリがありますINが、に変更するとNOT IN、何も返されません。
誰か提案はありますか?

select distinct 
    CAST( w.work_area AS CHAR(4) ) || s.code_id as WATT 
from 
    sys_code s, 
    work_area_master w 
where 
    s.code_type = '590' 
    and (
        CAST( w.work_area AS CHAR(4)) || s.code_id
    )  
    in (
        select substr(misc_flags, 1,6) 
        from sys_code where code_type = 'STA'
    );
4

4 に答える 4

1

A が NULL である可能性がある場合は常に、除外原則 (つまり、A または ~A がトートロジーである) は適用されません。null 許容フィールドが存在する場合、3 つの値を持つ loigc が適用され、除外原則を ( A または ~A または A が NULL) に変更する必要があります。

于 2013-03-13T18:26:18.253 に答える
1
SELECT DISTINCT
    CAST( w.work_area AS CHAR(4) ) || s.code_id AS what 
FROM sys_code s
JOIN work_area_master w ON 1=1 
WHERE s.code_type = '590' 
AND EXISTS (
    SELECT * FROM sys_code xx
    WHERE xx.code_type = 'STA'
    AND substr(xx.misc_flags, 1,6) = CAST( w.work_area AS CHAR(4)) || s.code_id
    );

脚注:JOIN ... ON 1=1元のクエリには結合条件さえなかったという事実に注意を引くために、意図的に構文を使用しました (相関IN サブクエリの条件を除く) 。

于 2013-03-13T19:14:44.687 に答える
0

sys_codeとの組み合わせwork_area_masterが有効かどうかのチェックは、実際に条件JOINにすることができます。

@wilplasser がすでに提供されているような問題を回避するためEXISTSに、代わりに使用することもできます。INNULL

SELECT DISTINCT
       CAST( w.work_area AS CHAR(4) ) || s.code_id AS what 
FROM   sys_code s
JOIN   work_area_master w ON EXISTS (
          SELECT 1
          FROM   sys_code x
          WHERE  x.code_type = 'STA'
          AND    substr(x.misc_flags, 1,6)
                 = CAST(w.work_area AS CHAR(4)) || s.code_id
          )
WHERE  s.code_type = '590' ;

NOT INとに関する問題の詳細な説明については、 dba.SE に関するNULLこの密接に関連した質問を参照してください。

于 2013-03-13T19:36:32.393 に答える
-1

次のような合体関数を含めることができます。

select distinct CAST( w.work_area AS CHAR(4) ) || s.code_id as WATT
from sys_code s, work_area_master w
where s.code_type = '590' 
and (CAST( w.work_area AS CHAR(4)) || s.code_id) in (
select substr(coalesce(misc_flags,"    "), 1,6)
from sys_code
where code_type = 'STA'
);
于 2013-03-13T18:24:18.350 に答える