¿Es posible hacer una entre mayúsculas y minúsculas distinto con SQL (PROC) SAS?

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

  •  06-09-2019
  •  | 
  •  

Pregunta

¿Hay una manera de obtener las filas distintas mayúsculas y minúsculas de esta consulta SQL SAS? ...

SELECT DISTINCT country FROM companies;

La solución ideal consistiría en una única consulta.

Los resultados ahora se ven como:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

... donde cualquiera de las 2 filas distintas realmente se requiere

Uno podría mayúsculas los datos, pero esto cambia innecesariamente los valores de una manera que no se ajusta a la finalidad de esta consulta.

¿Fue útil?

Solución

Si tiene alguna clave int primaria (vamos a llamarlo ID), se puede usar:

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

Otros consejos

La normalización hace caso parece conveniente - si 'Australia', 'Australia' y 'AUSTRALIA' todo ocurre, ¿cuál de los tres habría que desea como el "caso-sensibilidad única" respuesta a su consulta, después de todo? Si usted está interesado en algunas heurísticas específicas (por ejemplo, contar cuántas veces se producen y escoger el más popular), esto sin duda puede hacer, pero podría ser una enorme cantidad de trabajo extra - así, ¿cuánto es tal persnicketiness vale para usted ?

Un método no es de SQL (en realidad sólo un solo paso como el paso de datos sólo crea una vista) sería:


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;

Tal vez me falta algo, pero ¿por qué no:

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;

Esto crea una vista con sólo nombres distintos como valores de fila.

Yo estaba pensando lo largo de las mismas líneas que Zach , pero pensaba que iba a mirar el problema con un ejemplo más 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;

Ahora podemos hacer salir
yo. Uno de cada categoría? Es decir, tres direcciones?
o
ii. O simplemente una dirección? si es así cuál es la versión deberíamos preferir?

Implementación de caso 1 puede ser tan simple como:

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

Implementación de caso 2 puede ser tan simple como:

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

A partir de SAS 9:

proc tipo de datos = input_ds SORTSEQ = lingüística (strengh = primaria);

  by sort_vars;

run;

Creo expresiones regulares pueden ayudar con el patrón que desea tener en su cadena de búsqueda.

Para la expresión regular se puede definir una UDF que se puede preparar de ver el tutorial. www.sqlteam.com/article/regular-expressions-in-t-sql

Gracias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top