2009-05-29 28 views
8

Có cách nào để nhận các hàng riêng biệt phân biệt chữ hoa chữ thường từ truy vấn SAS SQL này không? ...Có thể thực hiện DISTINCT phân biệt chữ hoa chữ thường với SAS (PROC SQL) không?

SELECT DISTINCT country FROM companies; 

Giải pháp lý tưởng sẽ bao gồm một truy vấn.

Kết quả bây giờ nhìn như:

Australia 
australia 
AUSTRALIA 
Hong Kong 
HONG KONG 

... nơi bất kỳ của 2 hàng riêng biệt là thực sự cần thiết

Một thể chữ hoa các dữ liệu, nhưng điều này không cần thiết thay đổi giá trị trong một cách mà không phù hợp với mục đích của truy vấn này.

Trả lời

6

Nếu bạn có một số phím int chính (chúng ta hãy gọi nó là ID), bạn có thể sử dụng:

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

Cảm ơn. Tôi nghi ngờ đây là phương pháp tốt nhất có sẵn. Tôi cũng tưởng tượng nó sẽ khó khăn để mở rộng trên các cột khác nhau và hàng ngàn hàng, nhưng sẽ cho nó một shot. Truy vấn thực tế đời sống của tôi có phần phức tạp hơn ví dụ được sử dụng cho câu hỏi của tôi. – Rog

+0

Phải có một số phỏng đoán trong giải pháp và tôi tin rằng bạn cần phải quyết định một cách rõ ràng cho mình (ví dụ: chọn một ID có ID thấp nhất). Nếu vấn đề SQL của bạn là "lớn hơn" - đăng câu hỏi phức tạp hơn và để đám đông SO thử nó ... :) –

+0

Bạn có thể giải thích câu hỏi của mình tại sao giải pháp upper() ít hơn tối ưu không? Trong giải pháp này, các trường hợp (Đúng, trên, dưới, điên, vv) là hoàn toàn tùy ý và dựa trên thứ tự trong dữ liệu. Tại sao trường hợp đầu tiên của trường hợp có liên quan nhiều hơn như là kết quả trả về so với trường hợp trên (quốc gia) của vụ án? –

2

Trường hợp bình thường có vẻ được khuyến khích - nếu 'Úc', 'Úc' và 'AUSTRALIA' xảy ra, bạn sẽ muốn một câu trả lời "độc đáo" cho truy vấn của mình? Nếu bạn quan tâm đến một số chẩn đoán cụ thể (ví dụ như đếm số lần chúng xuất hiện và chọn phổ biến nhất), điều này chắc chắn có thể được thực hiện nhưng có thể là một lượng lớn công việc phụ - vậy, bạn cần bao nhiêu ?

+0

Mục đích là sử dụng truy vấn phức tạp hơn để hiển thị địa chỉ cho người dùng lựa chọn và không quan trọng đối với địa chỉ nào được hiển thị, miễn là không có nhiều bản sao hợp lệ. – Rog

2

Một phương pháp phi SQL (thực sự chỉ là một bước duy nhất như là bước dữ liệu chỉ tạo ra một cái nhìn) sẽ be:


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; 
-2

Tôi nghĩ Cụm từ thông dụng có thể giúp bạn với mẫu bạn muốn có trong chuỗi tìm kiếm của bạn.

Đối với cụm từ thông dụng, bạn có thể xác định UDF có thể được chuẩn bị để xem hướng dẫn. www.sqlteam.com/article/regular-expressions-in-t-sql

Cảm ơn.

1

Có lẽ tôi đang thiếu một cái gì đó, nhưng tại sao không chỉ:

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; 

Điều này tạo ra một cái nhìn với chỉ tên riêng biệt như các giá trị liên tiếp.

+0

Điều này không nhất thiết thay đổi giá trị theo cách không phù hợp với mục đích của truy vấn này. Nói cách khác, nếu tồn tại một phiên bản trường hợp thấp hơn (hoặc thích hợp) không trùng lặp, đó là những gì sẽ xuất hiện trong các kết quả. – Rog

0

Tôi đã suy nghĩ dọc theo dòng giống như Zach, nhưng nghĩ tôi sẽ xem xét vấn đề với một ví dụ phức tạp hơn,

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; 

Bây giờ chúng ta có thể xuất
i. Một từ mỗi thể loại? Tức là ba địa chỉ?
HOẶC
ii. Hay chỉ một địa chỉ? nếu chúng ta thích phiên bản nào?

Thực hiện trường hợp 1 có thể đơn giản như:

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

Thực hiện trường hợp 2 có thể đơn giản như:

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

Trong trường hợp thứ hai, chúng ta có thể sử dụng ký tự * đặc biệt * để phân định các cột để chúng ta có thể tách chúng sau này. I E. CHỌN DISTINCT UPCASE (trim (line1) || '$$' || trim (line2)) AS address, pcode TỪ danh bạ ; Vì vậy, nếu chúng ta có thể tokenize địa chỉ trở lại line1 và line2 nếu cần thiết .. Chỉ cần một mặc dù tôi chắc chắn có những cách tốt hơn để làm điều đó .. :) – Raz

+0

Chúng tôi muốn trường hợp 2 (1 địa chỉ), nhưng lý tưởng kết quả phải là một trong các địa chỉ hiện có, không phải là một phiên bản chữ hoa mới. – Rog

0

Từ SAS 9:

proc loại data = input_ds sortseq = ngôn ngữ (strengh = primary);

by sort_vars; 

chạy;

Các vấn đề liên quan