Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将单词短语拆分,并在Postgres中列出所有子组_Sql_Postgresql_Select - Fatal编程技术网

Sql 将单词短语拆分,并在Postgres中列出所有子组

Sql 将单词短语拆分,并在Postgres中列出所有子组,sql,postgresql,select,Sql,Postgresql,Select,我有一个表项名称,如下所示: Microsoft Word Adobe Premiere Paint Mozila Firefox Adobe Photoshop CS7 Windows Movie Maker Microsoft Word Microsoft Word Adobe PremiereF Adobe Premier Paint Mozila firefox Adobe Photoshop CS7 Adobe Photoshop Photoshop CS7 Windows Mov

我有一个表项名称,如下所示:

Microsoft Word
Adobe Premiere
Paint
Mozila Firefox
Adobe Photoshop CS7
Windows Movie Maker
Microsoft
Word
Microsoft Word
Adobe
PremiereF
Adobe Premier
Paint
Mozila firefox
Adobe 
Photoshop
CS7
Adobe Photoshop
Photoshop CS7
Windows
Movie
Maker
我想选择数据表产品,列名如下:

Microsoft Word
Adobe Premiere
Paint
Mozila Firefox
Adobe Photoshop CS7
Windows Movie Maker
Microsoft
Word
Microsoft Word
Adobe
PremiereF
Adobe Premier
Paint
Mozila firefox
Adobe 
Photoshop
CS7
Adobe Photoshop
Photoshop CS7
Windows
Movie
Maker
我在用Postgres。。。。可以这样做吗?

您可以使用regexp\u split\u to\u数组:

编辑:

要获得您可以使用的每个组合,请执行以下操作:

WITH src AS (
    SELECT id,name, rn::int, (MAX(rn) OVER(PARTITION BY id))::int AS m_rn
    FROM s, 
     unnest(regexp_split_to_array(s.c, '\s+')) WITH ORDINALITY AS sub(name,rn)
)
SELECT id, string_agg(b.Name ,' ' ORDER BY rn) AS combination
FROM (SELECT p.id, p.Name, p.rn, RIGHT(o.n::bit(16)::text, m_rn) AS bitmap
      FROM src AS p
      CROSS JOIN generate_series(1, 100000) AS o(n)     
      WHERE o.n < 2 ^ m_rn) b
WHERE SUBSTRING(b.bitmap, b.rn, 1) = '1'
GROUP BY b.id, b.bitmap
ORDER BY id, b.bitmap;
我不太清楚你的预期结果是什么

对于Adobe Photoshop CS7,您的结果是:

Adobe 
Photoshop
CS7
Adobe Photoshop
Photoshop CS7
那么原始字符串Adobe Photoshop CS7呢?对于解决方案,我希望您希望所有子短语的顺序正确。因此,解决方案应包括ADOBE Photoshop CS7结果。这由包含原点字符串的其他结果指示

1第一步:从一开始获取所有子短语:

String: A B C D E

A
A B
A B C
A B C D
A B C D E
质疑

答:WITH查询使查询更简单,因为在2中只编写了一次相同的子查询。regexp_split_to_table函数在空格处拆分字符串,并将每个单词放在一行中

B:窗口函数row_number为指示原始字符串中原点位置的单词添加了一个计数器

C:窗口函数数组_agg OVER。。。ORDER BY N_单词将单词聚合到一个列表中。ORDER BY用于获取由原始单词位置指示的升序单词列表,而无需数组的顺序。\u agg将添加短语的所有单词,以获取所有单词行的原始字符串

2第二步:从所有起点获取所有子短语:

String: A B C D E

A
B
C
D
E
A B
B C
C D
D E
A B C
B C D
C D E
A B C D
B C D E
A B C D E
质疑

A:和第一节一样

B:将短语与自己交叉连接;更好的说法是:用同一短语的每一个词组连接单词

C:此窗口函数将短语词聚合到给定结果


如果你不喜欢这个数组,你可以用函数array\u to\u stringphrase\u part,''将结果转换成字符串。

它只得到一个单词,怎么两个单词,三个单词?@adn只需添加UNION即可ALL@LukaszSzozda你的解决方案行不通。预期的解决方案不仅包括单个单词和原始字符串,还包括所有子部分。例如,一个包含3个单词的字符串应该在3个单词和1个3个单词的结果旁边生成一个或两个2个单词的结果。很好。这和我的想法完全不同。现在取决于@adn。。。我不确定“Adobe CS7”是否有效。意思可能只有直接跟在后面的词才可能构成一个副词。但这只是我对问题的解释:@S-Man谢谢你发现了它,这是一个很老的问题:
WITH single_words AS (                                                    -- A
    SELECT *, row_number() OVER (PARTITION BY id) AS nth_word FROM (
        SELECT id, regexp_split_to_table(phrase, '\s') as word FROM phrases
    )s
)
SELECT 
   *, 
   array_agg(b.word) OVER (PARTITION BY a.id, a.nth_word ORDER BY a.id, a.nth_word, b.nth_word) as phrase_part -- C
FROM single_words a                                                       -- B
JOIN single_words b                                       
ON (a.id = b.id AND a.nth_word <= b.nth_word)