sql شرح - طباعة هرم الأبجدية في بل / سكل




اوراكل ماهو (5)

هذا واحد يعمل:

DECLARE
    aLine VARCHAR2(100);
BEGIN
    FOR PyramidLevel IN 0..25 LOOP
        aLine := NULL;

        FOR i IN 0..PyramidLevel-1 LOOP
            aLine := aLine || CHR(i+65);
        END LOOP; 

        FOR i IN REVERSE 0..PyramidLevel LOOP
            aLine := aLine || CHR(i+65);
        END LOOP;
        aLine := LPAD(aLine, 26+PyramidLevel);       

       DBMS_OUTPUT.PUT_LINE('_'||aLine);
    END LOOP;
END;


_                         A
_                        ABA
_                       ABCBA
_                      ABCDCBA
_                     ABCDEDCBA
_                    ABCDEFEDCBA
_                   ABCDEFGFEDCBA
_                  ABCDEFGHGFEDCBA
_                 ABCDEFGHIHGFEDCBA
_                ABCDEFGHIJIHGFEDCBA
_               ABCDEFGHIJKJIHGFEDCBA
_              ABCDEFGHIJKLKJIHGFEDCBA
_             ABCDEFGHIJKLMLKJIHGFEDCBA
_            ABCDEFGHIJKLMNMLKJIHGFEDCBA
_           ABCDEFGHIJKLMNONMLKJIHGFEDCBA
_          ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
_         ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
_        ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
_       ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
_      ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
_     ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
_    ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
_   ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
_  ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
_ ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
_ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA

يبدو أن DBMS_OUTPUT.PUT_LINE() الزخارف التي تقود أحرف الفضاء (على الأقل في "تاد")، لذلك أضع _ في البداية.

لدي ممارسة لكتابة برنامج الذي يطبع هرم الأبجدية مثل هذا:

    A
   ABA
  ABCBA
 ABCDCBA
ABCDFDCBA

وتقترح المهمة أيضا استخدام إنستر، لباد، وبر.

أريد أن يكون الهرم الذي يحتوي على جميع الحروف في الأبجدية. ومع ذلك، أجد أنه من الأسهل لجعله في الأرقام أولا حتى:

IF x in 0..25 loop
dbms_output.put_line(x);
end loop;
end; 

والنتيجة هي مجرد خط مستقيم من الأرقام من 0-25. أنا لا أعرف كيفية إضافة مسافات قبل الأرقام، والتي تحتاج في نهاية المطاف أن تكون الحروف، لتشكيل شكل الهرم. من فضلك لا تعطي الإجابة الكاملة، أنا فقط بحاجة الى بعض الاقتراحات و ديريتيونس لحل هذه المهمة.


طريقة واحدة للقيام بذلك هي لتوليد قاعدة الهرم:

إذا كان يمكن إنشاء قاعدة ثم الدالة TRANSLATE يمكن أن تحل محل أحرف متعددة مع أحرف أخرى في مراسلات 1 إلى 1 لذلك:

  • TRANSLATE( 'ABC', 'ABC', ' A' ) المخرجات ' A'
  • TRANSLATE( 'ABC', 'ABC', ' AB' ) الإخراج ' AB'
  • TRANSLATE( 'ABC', 'ABC', 'ABC' ) إخراج 'ABC'

إذا كنت قد أنشأت قاعدة الهرم ثم لديك سلسلة حيث تبدأ السلسلة الفرعية مع تلك الأحرف وتحتاج فقط سلسلة فرعية من الطول المناسب مبطن بمسافات.

DBMS_OUTPUT.PUT_LINE( string ) بطباعة سلسلة إلى وحدة التحكم.

الحل الكامل - لا تتبع الارتباط إذا كنت لا تريد أن تعرف كيف فعلت هذا


يمكنك أن تفعل كل شيء في سكل. هذا يعمل في العلجوم (تشغيل كنص؛ F5). ملاحظة حصلت على خطأ "رقم غير صالح" إلا إذا ملفوفة "المستوى 1" في مكالمة TO_NUMBER () في المكالمة regexp_substr الثانية.

تلميحات: استخدام كونيكت بي بناء على حلقة من خلال الصفوف. كونيكت بي تلقائيا يجعل متاح متغير يسمى level الذي الزيادات لكل التكرار.

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

هل لاحظت تسلسل فيبوناتشي؟ عدد الأحرف على كل صف هو مجموع عدد الصف هذا بالإضافة إلى عدد الصف السابق (لا علاقة له بالإجابة (على الأقل إجابتي)، مجرد نمط لاحظته).

مثال كسل سكل الجواب هنا، ولكن المسافات الرائدة لن تظهر. لديك لصق الحل في العلجوم أو سكلبلوس و أونكومنت خطوط "مجموعة".

تحرير: ذهبت إلى سكل الكمان لمحاولة شيء وجدت أنه كان معلقة. وبما أنني لم أكن أرغب في فقدان إجابتي، وكان الجميع ينشر إجابات كاملة على أي حال، وهنا هو للأجيال القادمة:

SQL> set heading off;
SQL> set feedback off;
SQL> set pagesize 0;
SQL>
SQL> select lpad(' ', 26-level, ' ') ||
     regexp_substr('ABCDEFGHIJKLMNOPQRSTUVWXYZ', '(.{' || level ||'})', 1, 1, NULL, 1) ||
     reverse(regexp_substr('ABCDEFGHIJKLMNOPQRSTUVWXYZ', '(.{' || to_number(level-1) ||'})', 1, 1, NULL, 1)) pyramid
     from dual
     connect by level <= 26;

                         A
                        ABA
                       ABCBA
                      ABCDCBA
                     ABCDEDCBA
                    ABCDEFEDCBA
                   ABCDEFGFEDCBA
                  ABCDEFGHGFEDCBA
                 ABCDEFGHIHGFEDCBA
                ABCDEFGHIJIHGFEDCBA
               ABCDEFGHIJKJIHGFEDCBA
              ABCDEFGHIJKLKJIHGFEDCBA
             ABCDEFGHIJKLMLKJIHGFEDCBA
            ABCDEFGHIJKLMNMLKJIHGFEDCBA
           ABCDEFGHIJKLMNONMLKJIHGFEDCBA
          ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
         ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
 ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA
SQL>

اقتراحان:

في السطر الأول هناك 1 حرف، في السطر الثاني 3 أحرف، في السطر الثالث 5 أحرف ... حتى 1،3،5،7،9 .... إلى اللانهائي. لا أستطيع فهم ما تريد مع:

IF x in 0..25 loop

حرف خط الفاصل الخاص بك dbms_output هو:

chr(13)||chr(10) -> Windows
chr(10) -> Unix

تم إضافة ميزة جديدة ، IIF (التي يمكننا استخدامها ببساطة) ، في SQL Server 2012:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product




sql oracle plsql