Pergunta

Existe uma maneira de obter as linhas distintas de esta consulta SAS SQL maiúsculas e minúsculas? ...

SELECT DISTINCT country FROM companies;

A solução ideal consistiria em uma única consulta.

Os resultados agora olhar como:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

... onde qualquer uma das 2 linhas distintas é realmente necessário

Um poderia maiúsculas os dados, mas estes valores mudanças desnecessariamente de uma forma que não combina com o propósito de esta consulta.

Foi útil?

Solução

Se você tem alguma chave int primária (vamos chamá-lo ID), você pode usar:

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

Outras dicas

A normalização caso parece aconselhável - se 'Austrália', 'Australia' e 'Austrália' tudo ocorrer, o que um dos três que você quer como a resposta "caso sensibilidade única" para a sua consulta, depois de tudo? Se você está interessado em algumas heurísticas específicas (por exemplo, contar quantas vezes eles ocorrem e escolher o mais popular), este pode certamente ser feito, mas poderia ser uma enorme quantidade de trabalho extra - assim, quanto vale tal persnicketiness para você ?

Um método não-SQL (realmente apenas um único passo que a etapa de dados apenas cria uma visão) seria:


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;

Talvez eu estou faltando alguma coisa, mas porque não basta:

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;

Isso cria uma exibição com apenas nomes distintos como valores de linha.

Eu estava pensando ao longo das mesmas linhas como Zach , mas pensei que eu iria olhar para o problema com um exemplo mais elaborado,

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;

Agora podemos saída
Eu. Um de cada categoria? Ou seja, três endereços?
ou
ii. Ou apenas um endereço? em caso afirmativo qual versão devemos prefere?

caso Implementação 1 pode ser tão simples como:

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

caso Implementação 2 pode ser tão simples como:

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

De SAS 9:

Os dados de ordenação proc = input_ds sortseq = linguística (strengh = primário);

  by sort_vars;

executar;

Eu acho que expressões regulares podem ajudá-lo com o padrão que você quer ter em sua cadeia de pesquisa.

Para a expressão regular que você pode definir um UDF que pode ser preparado de ver o tutorial. www.sqlteam.com/article/regular-expressions-in-t-sql

Graças.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top