是否可以使用SAS(PROC SQL)进行不区分大小写的DISTINCT?

时间:2009-05-29 05:31:10

标签: sql sas proc-sql

有没有办法从此SAS SQL查询中获取不区分大小写的不同行? ...

SELECT DISTINCT country FROM companies;

理想的解决方案包括单个查询。

结果现在看起来像:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

...真正需要2个不同行中的任何一个

可以大写数据,但这会以不符合此查询目的的方式不必要地更改值。

7 个答案:

答案 0 :(得分:6)

如果你有一些主要的int键(我们称之为IF),你可以使用:

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

答案 1 :(得分:2)

规范化案例似乎是可取的 - 如果“澳大利亚”,“澳大利亚”和“澳大利亚”都出现了,那么您想要的三个中哪一个作为对您的查询的“区分大小写的独特”答案呢?如果你热衷于一些特定的启发式方法(例如计算它们发生的次数并选择最受欢迎的方法),这肯定可以完成,但可能会有大量的额外工作 - 所以,这样的持久性对你有多大价值?

答案 2 :(得分:2)

非SQL方法(实际上只是一步,因为数据步骤只是创建一个视图)将是:


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;

答案 3 :(得分:1)

也许我错过了什么,但为什么不呢:

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;

这会创建一个只有不同名称作为行值的视图。

答案 4 :(得分: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;

现在我们可以输出
一世。每个类别一个?即三个地址?
OR
II。或者只是一个地址?如果是的话我们应该选择哪个版本?

实施案例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;

答案 5 :(得分:0)

来自SAS 9:

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

  by sort_vars;

运行;

答案 6 :(得分:-2)

我认为正则表达式可以帮助您使用搜索字符串中的模式。

对于正则表达式,您可以定义一个可以在阅读教程时准备的UDF。 www.sqlteam.com/article/regular-expressions-in-t-sql

感谢。