OraQA

Oracle Question and Answer

  • Do you have a solution to a problem? Do you have an unanswered question? Login and share it with the Oracle community. More...

Oracle News


Entries RSS feed

Comments RSS feed

How to display combinations using the table format in a SQL statement

February 14th, 2007 By Frank Zhou

The following SQL pattern can be used to display all the combinations for a predetermined number of columns using the table format.

SQL> COLUMN COL_1 FORMAT A8
SQL> COLUMN COL_2 FORMAT A8
SQL> COLUMN COL_3 FORMAT A8
SQL> variable input number
SQL> exec :input := 3

SELECT
MAX(CASE WHEN comb = 'A' THEN comb END) AS COL_1,
MAX(CASE WHEN comb = 'B' THEN comb END) AS COL_2,
MAX(CASE WHEN comb = 'C' THEN comb END) AS COL_3
FROM
(SELECT
      SUBSTR(comb,
      INSTR(comb, '#', 1, LEVEL  ) + 1,
      INSTR(comb, '#', 1, LEVEL+1) -
      INSTR(comb, '#', 1, LEVEL) -1) comb,  rn
 FROM
 (SELECT comb, rn
    FROM
    (SELECT sys_connect_by_path(n, '#')||'#' comb,  rownum rn
       FROM
     (SELECT chr(ascii('A')+level-1)  n
        FROM dual CONNECT BY LEVEL <=:input)
      CONNECT BY n  > PRIOR n
    )
  )
  CONNECT BY PRIOR comb = comb AND PRIOR rn = rn
  AND INSTR (comb, '#', 1, LEVEL+1) > 0
  AND PRIOR dbms_random.string ('p', 10) IS NOT NULL
)
GROUP BY rn
ORDER BY rn;

COL_1    COL_2    COL_3
-------- -------- --------
A
A        B
A        B        C
A                 C
         B
         B        C
                  C              

Here I will display the letters as “#’ to make it more generic.

SELECT
REGEXP_REPLACE(MAX(CASE WHEN comb = 'A'
                        THEN comb END), '[[:alpha:]]','#') AS COL_1,
REGEXP_REPLACE(MAX(CASE WHEN comb = 'B'
                        THEN comb END), '[[:alpha:]]','#') AS COL_2,
REGEXP_REPLACE(MAX(CASE WHEN comb = 'C'
                        THEN comb END), '[[:alpha:]]','#') AS COL_3
FROM
(SELECT
      SUBSTR(comb,
      INSTR(comb, '#', 1, LEVEL  ) + 1,
      INSTR(comb, '#', 1, LEVEL+1) -
      INSTR(comb, '#', 1, LEVEL) -1 ) comb,  rn
 FROM
 (SELECT comb, rn
    FROM
    (SELECT sys_connect_by_path(n, '#')||'#' comb, rownum rn
       FROM
     (SELECT chr(ascii('A')+level-1)  n
        FROM dual CONNECT BY LEVEL <=3)
      CONNECT BY n  > PRIOR n
    )
  )
  CONNECT BY PRIOR comb = comb AND PRIOR rn = rn
  AND INSTR (comb, '#', 1, LEVEL+1) > 0
  AND PRIOR dbms_random.string ('p', 10) IS NOT NULL
)
GROUP BY rn
ORDER BY rn;

COL_1    COL_2    COL_3
-------- -------- --------
#
#        #
#        #        #
#                 #
         #
         #        #
                  #                                                            

7 rows selected.

One Response to “How to display combinations using the table format in a SQL statement”

  1. newkid Says:
    variable input number
    exec :input := 4
    
    SELECT CASE WHEN BITAND(ROWNUM,1)>0 THEN '#' END
          ,CASE WHEN BITAND(ROWNUM,2)>0 THEN '#' END
          ,CASE WHEN BITAND(ROWNUM,4)>0 THEN '#' END
          ,CASE WHEN BITAND(ROWNUM,8)>0 THEN '#' END
      FROM DUAL
    CONNECT BY ROWNUM<=POWER(2,:input)-1;
    
    C C C C
    - - - -
    #
      #
    # #
        #
    #   #
      # #
    # # #
          #
    #     #
      #   #
    # #   #
        # #
    #   # #
      # # #
    # # # #
    
    15 rows selected.
    

Leave a Reply

You must be logged in to post a comment.

RSS feed for comments on this question