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
;
Kết quả:
str | str
-----+-----
W | T
W | F
W | !
T | F
T | !
F | !
(6 rows)
Đáng tiếc là tôi không thể tìm thấy một cách để tránh các chuỗi kép liên tục. (nhưng toàn bộ điều có thể được đóng gói vào một chức năng) Nếu không có nhân vật trùng lặp (hoặc bạn muốn suppres chúng) bạn có thể làm chống tham gia trên đường thay vì idx.
CẬP NHẬT (gợi ý từ ypercube) Dường như OP muốn các chuỗi được ghép nối. Vì vậy, có thể là ::
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
;
Kết quả:
results
---------
WT
WF
W!
TF
T!
F!
(6 rows)
UPDATE2: (ở đây có thingy đệ quy ...)
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
;
Kết quả 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)
Tại sao bạn sẽ làm điều đó trong một DBMS? Bạn không thể làm điều đó ở cấp ứng dụng? –
Tôi có thể sử dụng trong một sudoku-solver ;-) – wildplasser
Tôi sẽ sử dụng nó trong nhiều ngôn ngữ lập trình và chỉ một cơ sở dữ liệu PostgreSQL, vì vậy tôi đã nghĩ rằng đây sẽ là cách dễ nhất để có điều này ở một nơi. Điều này không cần phải tham gia chuỗi, tôi chỉ cung cấp cho sugestion cách hoạt động. – ffox003