sql अंतर - पीएल / एसक्यूएल में एक वर्णमाला पिरामिड छपाई




है और (5)

मेरे पास एक प्रोग्राम लिखना है जो इस तरह वर्णमाला पिरामिड को प्रिंट करता है:

    A
   ABA
  ABCBA
 ABCDCBA
ABCDFDCBA

कार्य INSTR, एलपीएडी, यूपीईआर का भी सुझाव देता है।

मुझे पिरामिड में रखना है जिसमें वर्णमाला के सभी अक्षर शामिल हैं I हालांकि, मुझे लगता है कि पहले संख्या में इसे बनाना आसान है:

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

परिणाम 0-25 से संख्याओं की सीधी रेखा है। मैं नहीं जानता कि संख्याओं से पहले रिक्त स्थान कैसे जोड़ना है, जो आखिरकार अक्षरों की आवश्यकता है, ताकि पिरामिड आकार बना सके। कृपया पूरा जवाब न दें, मुझे इस कार्य को हल करने के लिए कुछ सुझाव और गंभीरताएं की आवश्यकता है।


Answers

दो सुझाव:

पहली पंक्ति में 1 अक्षर हैं, दूसरी पंक्ति 3 अक्षरों में, तीसरे पंक्ति में 5 अक्षरों ... तो 1,3,5,7,9 .... अनंत के लिए मैं समझ नहीं पाया कि आप क्या चाहते हैं:

IF x in 0..25 loop

आपके dbms_output के लिए ब्रेक लाइन वर्ण है:

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

आदर्श खंड का उपयोग करते हुए शुद्ध एसक्यूएल

select lpad(x1, 26, ' ') || substr(x2, 2) x from dual
model
dimension by (1 id)
measures (cast(null as varchar2(26)) x1, cast(null as varchar2(26)) x2)
(x1[for id from 1 to 26 increment 1] = x1[cv(id)-1] || chr(64+cv(id)),
x2[for id from 1 to 26 increment 1] = chr(64+cv(id)) || x2[cv(id)-1]);

X
---------------------------------------------------
                         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

26 rows selected.

अद्यतन करें। मस्ती के लिए, एकल नियम के साथ एक ही परिणाम

select lpad(' ', 26 - ceil(length(x)/2), ' ')  || x as x from dual
model
dimension by (1 id)
measures (cast(null as varchar2(51)) x)
(x[for id from 1 to 26 increment 1] = substr(x[cv(id)-1], 1, cv(id)-1) || chr(64+cv(id)) || substr(x[cv(id)-1], cv(id)-1));

select lpad(' ', 26 - ceil(length(x)/2), ' ')  || x as x
from (select 'A' x from dual union all select 'ABA' from dual)
model
dimension by (rownum id)
measures (cast(x as varchar2(51)) x)
(x[for id from 3 to 26 increment 1] = regexp_replace(x[cv(id)-1], '(.)(.)\1', '\1\2' || chr(64+cv(id)) || '\2\1'));

यह एक काम करता है:

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() कम से कम मेरे टॉड में स्पेस वर्णों को ट्रिम करता है, इसलिए मैंने शुरुआत में _ डाल दिया।


आप एसक्यूएल में यह सब कर सकते हैं। यह टॉड में काम करता है (एक स्क्रिप्ट के रूप में चला जाता है; F5) नोट मुझे "अमान्य संख्या" त्रुटि मिली जब तक कि दूसरे regexp_substr कॉल में TO_NUMBER () कॉल में "स्तर -1" लपेट नहीं किया।

संकेत: पंक्तियों के माध्यम से लूप का निर्माण करके कनेक्ट करें का उपयोग करें। कनेक्ट द्वारा स्वचालित रूप से एक वेरिएबल level उपलब्ध कराया जाता 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>

In SQL Server 2016+ another possibility is to use the OPENJSON function.

This approach is blogged about in OPENJSON - one of best ways to select rows by list of ids .

A full worked example below

CREATE TABLE dbo.Tags
  (
     Name  VARCHAR(50),
     Count INT
  )

INSERT INTO dbo.Tags
VALUES      ('VB',982), ('ruby',1306), ('rails',1478), ('scruffy',1), ('C#',1784)

GO

CREATE PROC dbo.SomeProc
@Tags VARCHAR(MAX)
AS
SELECT T.*
FROM   dbo.Tags T
WHERE  T.Name IN (SELECT J.Value COLLATE Latin1_General_CI_AS
                  FROM   OPENJSON(CONCAT('[', @Tags, ']')) J)
ORDER  BY T.Count DESC

GO

EXEC dbo.SomeProc @Tags = '"ruby","rails","scruffy","rubyonrails"'

DROP TABLE dbo.Tags 




sql oracle plsql