8

この SAS SQL クエリから大文字と小文字を区別しない個別の行を取得する方法はありますか? ...

SELECT DISTINCT country FROM companies;

理想的なソリューションは、単一のクエリで構成されます。

結果は次のようになります。

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

... 2 つの異なる行のいずれかが実際に必要な場合

データを大文字にすることもできますが、これは、このクエリの目的に適さない方法で値を不必要に変更します。

4

7 に答える 7

6

主な int キー (ID と呼びましょう) がある場合は、次を使用できます。

SELECT country FROM companies
WHERE id =
(
    SELECT Min(id) FROM companies
    GROUP BY Upper(country)
)
于 2009-05-29T05:40:31.183 に答える
2

大文字と小文字を正規化することをお勧めします。「Australia」、「australia」、および「AUSTRALIA」がすべて発生した場合、クエリに対する「大文字と小文字を区別する一意の」回答として 3 つのうちのどれが必要ですか? 特定のヒューリスティックに関心がある場合 (たとえば、発生回数を数えて最も人気のあるものを選択するなど)、これは確かに実行できますが、膨大な量の余分な作業になる可能性があります。 ?

于 2009-05-29T05:39:20.313 に答える
2

非 SQL メソッド (データ ステップがビューを作成するだけなので、実際には 1 つのステップのみ) は次のようになります。


data companies_v /view=companies_v;
  set companies (keep=country);
  _upcase_country = upcase(country);
run;

proc sort data=companies_v out=companies_distinct_countries (drop=_upcase_country) nodupkey noequals;
  by _upcase_country;
run;
于 2009-05-29T07:17:27.490 に答える
0

SAS 9 から:

proc sort data=input_ds sortseq=linguistic(strengh=primary);

  by sort_vars;

走る;

于 2013-10-04T20:49:19.727 に答える
0

私はZachと同じ方向に沿って考えていましたが、より精巧な例で問題を見てみようと思いました。

proc sql;
    CREATE TABLE contacts (
        line1 CHAR(30), line2 CHAR(30), pcode CHAR(4)
    );
    * Different versions of the same address - L23 Bass Plaza 2199;
    INSERT INTO contacts values('LEVEL 23 bass', 'plaza'  '2199');
    INSERT INTO contacts values('level 23 bass ', ' PLAZA'  '2199');

    INSERT INTO contacts values('Level 23', 'bass plaza'  '2199');
    INSERT INTO contacts values('level 23', 'BASS plaza'  '2199');

    *full address in line 1;
    INSERT INTO contacts values('Level 23 bass plaza', ''  '2199');
    INSERT INTO contacts values(' Level 23 BASS plaza  ', ''  '2199');

;quit;


これでiを出力できます。各カテゴリーから1つ?つまり、3つのアドレスですか?
または
ii。それとも1つのアドレスだけですか?もしそうなら、どのバージョンを好むべきですか?

ケース 1 の実装は次のように簡単です。

proc sql;
    SELECT DISTINCT UPCASE(trim(line1)), UPCASE(trim(line2)), pcode 
    FROM contacts 
;quit;

ケース 2 の実装は次のように簡単です。

proc sql;
    SELECT DISTINCT UPCASE( trim(line1) || ' ' || trim(line2) ) , pcode 
    FROM contacts 
;quit;
于 2009-05-29T23:23:36.553 に答える
-2

正規表現は、検索文字列に含めるパターンを理解するのに役立つと思います。

正規表現の場合、チュートリアルを参照して準備できるUDFを定義できます。www.sqlteam.com/article/regular-expressions-in-t-sql

ありがとう。

于 2009-05-29T08:11:30.860 に答える