AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 27279
Accepted
swasheck
swasheck
Asked: 2012-10-20 12:00:28 +0800 CST2012-10-20 12:00:28 +0800 CST 2012-10-20 12:00:28 +0800 CST

如何保留未嵌套数组中元素的原始顺序?

  • 772

给定字符串:

'我认为 PostgreSQL 很漂亮'

我想对该字符串中的单个单词进行操作。本质上,我有一个单独的,我可以从中获取单词详细信息,并希望在该字典中加入该字符串的未嵌套数组。

到目前为止,我有:

select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;

这完成了我希望做的基本工作,但它不保留原始词序。

相关问题:
带有元素编号的 PostgreSQL unnest()

postgresql sorting
  • 1 1 个回答
  • 22207 Views

1 个回答

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2012-10-20T14:21:57+08:002012-10-20T14:21:57+08:00

    WITH ORDINALITY在 Postgres 9.4 或更高版本中

    查询现在可以简单地是:

    SELECT *
    FROM   regexp_split_to_table('I think Postgres is nifty', ' ') WITH ORDINALITY x(word, rn);
    

    或者,应用于表格:

    SELECT *
    FROM   tbl t, regexp_split_to_table(t.col, ' ') WITH ORDINALITY x(word, rn);
    

    细节:

    • 带有元素编号的 PostgreSQL unnest()

    关于隐式LATERAL连接:

    • LATERAL 和 PostgreSQL 中的子查询有什么区别?

    db<>fiddle here
    旧的 sqlfiddle

    Postgres 9.3 或更早版本 - 以及更一般的解释

    对于单个字符串

    您可以应用窗口函数row_number()来记住元素的顺序。但是,通常row_number() OVER (ORDER BY col)您会根据排序顺序获得数字,而不是字符串中的原始位置。

    您可以简单地省略ORDER BY以获得“原样”的位置:

    SELECT *, row_number() OVER () AS rn
    FROM   regexp_split_to_table('I think Postgres is nifty', ' ') AS x(word);
    

    regexp_split_to_table()长字符串会降低 性能。unnest(string_to_array(...))规模更好:

    SELECT *, row_number() OVER () AS rn
    FROM   unnest(string_to_array('I think Postgres is nifty', ' ')) AS x(word);
    

    然而,虽然这通常有效,而且我从未见过它在简单查询中中断,但 Postgres 对没有显式ORDER BY.

    为保证原始字符串中元素的序数,请使用generate_subscript()(由@deszo 评论改进):

    SELECT arr[rn] AS word, rn
    FROM   (
       SELECT *, generate_subscripts(arr, 1) AS rn
       FROM   string_to_array('I think Postgres is nifty', ' ') AS x(arr)
       ) y;
    

    对于字符串表

    添加PARTITION BY id到OVER子句...

    演示表:

    CREATE TEMP TABLE strings(string text);
    INSERT INTO strings VALUES
      ('I think Postgres is nifty')
    , ('And it keeps getting better');
    

    我用作主键ctid的临时替代品。如果您有一个(或任何唯一列),请改用它。

    SELECT *, row_number() OVER (PARTITION BY ctid) AS rn
    FROM  (
       SELECT ctid, unnest(string_to_array(string, ' ')) AS word
       FROM   strings
       ) x;
    

    这在没有任何不同 ID 的情况下有效:

    SELECT arr[rn] AS word, rn
    FROM  (
       SELECT *, generate_subscripts(arr, 1) AS rn
       FROM  (
          SELECT string_to_array(string, ' ') AS arr
          FROM   strings
          ) x
       ) y;
    

    回答问题

    SELECT z.arr, z.rn, z.word, d.meaning   -- , partofspeech -- ?
    FROM  (
       SELECT *, arr[rn] AS word
       FROM  (
          SELECT *, generate_subscripts(arr, 1) AS rn
          FROM  (
             SELECT string_to_array(string, ' ') AS arr
             FROM   strings
             ) x
          ) y
       ) z
    JOIN   dictionary d ON d.wordname = z.word
    ORDER  BY z.arr, z.rn;
    
    • 29

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve