Est-il possible de faire une insensible à la casse DISTINCT avec SAS (PROC SQL)?

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

  •  06-09-2019
  •  | 
  •  

Question

Y at-il un moyen d'obtenir les majuscules et les minuscules lignes distinctes de cette requête SQL SAS? ...

SELECT DISTINCT country FROM companies;

La solution idéale consisterait en une seule requête.

Les résultats ressemblent maintenant à:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

... où est-il vraiment nécessaire l'un des 2 lignes distinctes

On pourrait en majuscules les données, mais cela change inutilement les valeurs d'une manière qui ne convient pas dans le but de cette requête.

Était-ce utile?

La solution

Si vous avez une clé int primaire (appelons-le ID), vous pouvez utiliser:

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

Autres conseils

Normaliser cas ne semble souhaitable - si l'Australie ', « Australie » et « AUSTRALIE » se produisent tous, dont l'un des trois voudriez-vous que la réponse « sensible à la casse unique » à votre requête, après tout? Si vous êtes désireux de quelques heuristiques spécifiques (par exemple, compter combien de fois ils se produisent et prennent les plus populaires), cela peut certainement être fait, mais peut-être une énorme quantité de travail supplémentaire - donc, combien est telle persnicketiness vaut pour vous ?

Une méthode non-SQL (vraiment une seule étape que l'étape de données crée juste une vue) serait:


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;

Peut-être que je manque quelque chose, mais pourquoi pas seulement:

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;

Cela crée une vue avec seulement des noms distincts comme des valeurs de ligne.

Je pensais dans le même sens que Zach , mais pensé que je regardais le problème avec un exemple plus complexe,

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;

Maintenant, nous pouvons sortie
je. Une de chaque catégorie? -À-dire trois adresses
ou ii. Ou tout simplement une adresse? si oui quelle version doit-on préférer?

La mise en œuvre le cas 1 peut être aussi simple que:

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

La mise en œuvre de cas 2 peut être aussi simple que:

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

De SAS 9:

proc sort data = input_ds sortseq = linguistique (= strengh primaire);

  by sort_vars;

run;

Je pense que les expressions régulières peuvent vous aider avec le modèle que vous voulez avoir dans votre chaîne de recherche.

Pour l'expression régulière, vous pouvez définir une UDF qui peut être préparé de voir le tutoriel. www.sqlteam.com/article/regular-expressions-in-t-sql

Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top