هل من الممكن إجراء حساس لحالة الأحرف المميزة مع SAS (Proc SQL)؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

هل هناك طريقة للحصول على صفوف غير حساسة لحالة الأحرف من استعلام SAS SQL؟ ...

SELECT DISTINCT country FROM companies;

الحل المثالي يتكون من استفسار واحد.

النتائج تبدو الآن:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

... حيث يكون أي من صفوف 2 مميزة حقا

يمكن للمرء العلوي عن البيانات، ولكن هذه التغييرات التي لا يدل دون داع بطريقة لا تناسب الغرض من هذا الاستعلام.

هل كانت مفيدة؟

المحلول

إذا كان لديك بعض المفتاح الدولي الأول (دعونا نسميها بالمعرف)، فيمكنك استخدام:

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

نصائح أخرى

لا يبدو أن الحالة الطبيعية مستحقة - إذا حدثت "أستراليا" و "أستراليا" و "أستراليا"، أي واحد من الثلاثة سوف ترغب في إجابة "فريدة من نوعها بحساسية" على استفسارك، بعد كل شيء؟ إذا كنت حريصا على بعض الاستدلال المحددة (على سبيل المثال، فإن عدد المرات التي تحدث فيها واختيار أكثر شعبية)، يمكن أن يتم هذا بالتأكيد ولكن قد تكون كمية هائلة من العمل الإضافي - لذلك، كم تبلغ قيمة هذه الثنيوية ب

طريقة غير 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;

ربما أنا أفتقد شيئا، ولكن لماذا لا فقط:

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;

هذا يخلق طريقة عرض مع أسماء مميزة فقط كقيم صف.

كنت أفكر على نفس الخطوط زاك, ، لكنني أعتقد أنني سألقي نظرة على المشكلة مع مثال أكثر تفصيلا،

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;

الآن يمكننا الإخراج
أنا. واحد من كل فئة؟ أي ثلاثة عناوين؟
أو
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;

من SAS 9:

Proc Sort Data = Input_DS SortseQ = اللغوي (Strengh = أساسي)؛

  by sort_vars;

يركض؛

أعتقد أن التعبيرات العادية يمكن أن تساعدك مع النمط الذي تريده في سلسلة البحث الخاصة بك.

بالنسبة للتعبير العادي، يمكنك تحديد UDF والتي يمكن إعدادها لرؤية البرنامج التعليمي. www.sqlteam.com/article/reanular-expressions-in-t-sql.

شكرا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top