Ist es möglich, ein Groß- und Kleinschreibung DISTINCT mit SAS (PROC SQL) zu tun?

StackOverflow https://stackoverflow.com/questions/924513

  •  06-09-2019
  •  | 
  •  

Frage

Gibt es eine Möglichkeit, die Groß- und Kleinschreibung unterschiedliche Zeilen von dieser SAS SQL-Abfrage zu bekommen? ...

SELECT DISTINCT country FROM companies;

Die ideale Lösung aus einer einzigen Abfrage bestehen würde.

Ergebnisse nun wie folgt aussehen:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

... wenn eine der zwei unterschiedlichen Zeilen ist wirklich erforderlich

Man könnte oberen Fall die Daten, aber dies unnötig ändert Werte in einer Weise, die nicht den Zweck dieser Abfrage nicht entsprechen.

War es hilfreich?

Lösung

Wenn Sie einige primäre int Schlüssel haben (lassen Sie uns ID nennen), könnten Sie verwenden:

SELECT country FROM companies
WHERE id =
(
    SELECT Min(id) FROM companies
    GROUP BY Upper(country)
)

Andere Tipps

Normalisieren Fall tut ratsam erscheinen - wenn ‚Australien‘, ‚Australien‘ und ‚Australien‘ alle auftreten, die eine der drei würden Sie als „Fall-sensibel einzigartige“ will Antwort auf Ihre Frage, nachdem alle? Wenn Sie auf einige spezifische Heuristiken scharf sind (zB zählen, wie oft sie auftreten, und wählen Sie die beliebtesten), das sicher getan werden kann, aber vielleicht eine riesige Menge an zusätzlicher Arbeit sein - so, wie viel ist eine solche persnicketiness Ihnen wert ?

Eine nicht-SQL-Methode (wirklich nur ein einziger Schritt, da die Daten Schritt erzeugt nur eine Sicht) sei:


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;

Vielleicht bin ich etwas fehlt, aber warum nicht einfach:

data testZ;
    input Name $;
    cards4;
Bob
Zach
Tim
Eric
Frank
ZacH
BoB
eric
;;;;
run;

proc sql;
    create view distinctNames as
    select distinct Upper(Name) from testz;
quit;

Dies schafft eine Ansicht mit nur unterschiedlichen Namen als Zeilenwert.

Ich war auf der gleichen Linie wie Zach zu denken, aber ich dachte, das Problem mit einem komplizierteren Beispiel aussehen würde,

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;

Jetzt können wir Ausgang | ich. Eine aus jeder Kategorie? Dh drei Adressen?
oder
ii. Oder nur eine Adresse? wenn ja, welche Version sollen wir bevorzugen?

Die Implementierung Fall 1 kann so einfach sein wie:

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

Die Implementierung Fall 2 kann so einfach sein wie:

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

Von SAS 9:

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

  by sort_vars;

Ausführen;

Ich denke, Reguläre Ausdrücke Sie heraus mit dem Muster helfen, können Sie in Ihrem Suchbegriff haben wollen.

Für den regulären Ausdruck können Sie eine benutzerdefinierte Funktion definieren, die das Tutorial hergestellt werden können, zu sehen. www.sqlteam.com/article/regular-expressions-in-t-sql

Danke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top