質問

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

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 for B.zip_extractの長さ6の文字;

役に立ちましたか?

解決

likeのマージは素晴らしいアイデアではありません。それはインデックスを使用せず、そうでなければ取得した最適化の多くを使用しません。しかし、時にはそれが必要です。

SASでは、私はこれを変えて他のほとんどのSQLS ...]

proc sql;

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

quit;
.

それは同様のものと同じことを達成しますが、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;
.

他のヒント

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

試してみてください:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top