8

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

SELECT DISTINCT country FROM companies;

理想的解决方案将由单个查询组成。

结果现在看起来像:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

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

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

4

7 回答 7

6

如果您有一些主 int 键(我们称之为 ID),您可以使用:

SELECT country FROM companies
WHERE id =
(
    SELECT Min(id) FROM companies
    GROUP BY Upper(country)
)
于 2009-05-29T05:40:31.183 回答
2

规范化大小写似乎是可取的——如果 'Australia'、'australia' 和 'AUSTRALIA' 都出现,那么您希望这三个中的哪一个作为您查询的“区分大小写的唯一”答案,毕竟?如果您热衷于某些特定的启发式方法(例如,计算它们出现的次数并选择最流行的),这当然可以完成,但可能需要大量的额外工作——所以,这样的挑剔对您来说值多少钱?

于 2009-05-29T05:39:20.313 回答
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;
于 2009-05-29T07:17:27.490 回答
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;

这将创建一个仅具有不同名称作为行值的视图。

于 2009-05-29T18:22:54.507 回答
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;

现在我们可以输出
i。每个类别一个?即三个地址?

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;
于 2009-05-29T23:23:36.553 回答
0

从 SAS 9:

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

  by sort_vars;

跑;

于 2013-10-04T20:49:19.727 回答
-2

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

对于正则表达式,您可以定义一个 UDF,可以通过查看教程来准备。www.sqlteam.com/article/regular-expressions-in-t-sql

谢谢。

于 2009-05-29T08:11:30.860 回答