sql >> データベース >  >> RDS >> PostgreSQL

繰り返しのないPostgreSQLの組み合わせ

    set search_path='tmp';
    
    WITH ztab AS (
    SELECT idx as idx
    , substring ( 'WTF!' FROM idx FOR 1) as str
    FROM generate_series(1, char_length( 'WTF!' )) idx
    )
    SELECT t1.str, t2.str
    FROM ztab t1
    JOIN ztab t2 ON t2.idx > t1.idx
            ;
    

    結果:

     str | str 
    -----+-----
     W   | T
     W   | F
     W   | !
     T   | F
     T   | !
     F   | !
    (6 rows)
    

    残念ながら、二重文字列定数を回避する方法を見つけることができません。 (ただし、すべてを関数にパックすることもできます)重複する文字がない場合(またはそれらを抑制したい場合)、idxの代わりにstrで反結合を行うことができます。

    UPDATE(ypercubeからのヒント)OPは文字列を連結することを望んでいるようです。だからそれでいい::

    WITH ztab AS (
    SELECT idx as idx
    , substring ( 'WTF!' FROM idx FOR 1) as str
    FROM generate_series(1, char_length( 'WTF!' )) idx
    )
    SELECT t1.str || t2.str AS results
    FROM ztab t1
    JOIN ztab t2 ON t2.idx > t1.idx
            ;
    

    結果:

     results 
    ---------
     WT
     WF
     W!
     TF
     T!
     F!
    (6 rows)
    

    UPDATE2 :(再帰的なものが来る...)

    WITH RECURSIVE xtab AS (
            WITH no_cte AS (
            SELECT
            1::int AS len
            , idx as idx
            , substring ( 'WTF!' FROM idx FOR 1) as str
            FROM generate_series(1, char_length( 'WTF!' )) idx
            )
            SELECT t0.len as len
                    , t0.idx
                    , t0.str
            FROM no_cte t0
            UNION SELECT 1+t1.len
                    , tc.idx
                    , t1.str || tc.str AS str
            FROM xtab t1
            JOIN no_cte tc ON tc.idx > t1.idx
            )
    SELECT * FROM xtab
    ORDER BY len, str
    -- WHERE len=2
            ;
    

    結果3:

     len | idx | str  
    -----+-----+------
       1 |   4 | !
       1 |   3 | F
       1 |   2 | T
       1 |   1 | W
       2 |   4 | F!
       2 |   4 | T!
       2 |   3 | TF
       2 |   4 | W!
       2 |   3 | WF
       2 |   2 | WT
       3 |   4 | TF!
       3 |   4 | WF!
       3 |   4 | WT!
       3 |   3 | WTF
       4 |   4 | WTF!
    (15 rows)
    


    1. SQLServerで複数のNULL値を許可する一意の制約を実装する適切な方法

    2. バージョン851であるため、データベースを開くことができません。このサーバーはバージョン782以前をサポートしています。ダウングレードパスはサポートされていません

    3. MYSQLのビットフィールドにインデックスを付ける

    4. データベース挿入のパフォーマンス