0

複数の列を持つ2つのテーブルがあります。次に、 like演算子を使用してそれらをマージします。私のコードは次のようなものです

proc sql;

    select a.*,b.*
    from tera.SFTP as a,home.SFTP_1 as b
    where a.zip_c like ('%b.zip_extract%')

;
quit;

改ページ メッセージが表示されますが、結果が返されません。a.zip_c の列の型は Char で長さは 50 ですが、b.zip_extract の列の型は長さ 6 の Char です。

4

2 に答える 2

2

マージするlikeのは良い考えではありません。インデックスを使用せず、他の方法で得られる多くの最適化を使用しません。ただし、必要な場合もあります。

ただし、SAS では、これを別の方法で行います [そして、他のほとんどの SQL では...]

proc sql;

    select a.*,b.*
    from tera.SFTP as a,home.SFTP_1 as b
    where find(a.zip_c,b.zip_extract)
;

quit;

これは LIKE と同じことを達成しますが、SAS がインデックスと最適化を使用できる可能性が高く、より明確に記述されています。

考えられる列の長さの問題に対処するには、TRIM を使用します。

data have_a;
 length zip_c $50;
 input @1 zip_c $50.;
 datalines;
12345 99999
67890 99999
88001 99999
37013 99999
60037 99999
;;;;
run;

data have_b;
 length zip_extract $7;
 input zip_extract $;
 datalines;
12345
37013
99998
;;;;
run;

proc sql;
  title "No Rows!";
    select a.*,b.*
    from have_a as a,have_b as b
    where find(a.zip_c,b.zip_extract)
;

quit;
proc sql;
  title "Rows!";
    select a.*,b.*
    from have_a as a,have_b as b
    where find(a.zip_c,trim(b.zip_extract))
;

quit;
于 2014-07-29T19:35:25.433 に答える
2

問題は、列ではなく、文字列 b.zip_extract で一致していることです。

試す:

select a.*,b.*
from tera.SFTP as a,home.SFTP_1 as b
where a.zip_c like '%' || b.zip_extract || '%'
于 2014-07-29T19:31:57.070 に答える