PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Kombinacje PostgreSQL bez powtórzeń

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
        ;

Wynik:

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

Niestety nie mogę znaleźć sposobu na uniknięcie stałej podwójnego łańcucha. (ale całość może być spakowana do funkcji) Jeśli nie ma zduplikowanych znaków (lub chcesz je pominąć), możesz wykonać anti-join na str zamiast idx.

UPDATE (wskazówka z ypercube) Wygląda na to, że OP chce łączyć ciągi. Niech tak będzie::

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
        ;

Wyniki:

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

UPDATE2:(tu zaczyna się rekursywna rzecz...)

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
        ;

Wyniki 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego Postgres mówi, że kolumna nie istnieje?

  2. Przywróć bazę danych PostgreSQL za pomocą java

  3. BŁĄD:operator nie istnieje:numeryczny ~* nieznany

  4. Postgresql Wiele zliczeń dla jednego stołu

  5. Jakie konkretne wyjątki reprezentują awarię serializacji, gdy Django używa poziomu izolacji transakcji z możliwością serializacji z postgresql?