【问题标题】:sql query to truncate columns which are above specified lengthsql查询截断超过指定长度的列
【发布时间】:2013-10-21 07:44:49
【问题描述】:

我在 postgres 中有下表:

create table1 (col1 character varying, col2 character varying);

我的表有以下数据:

col1            col2
Questions       Tags Users
Value1          Value2 Val      

我想找到 col1 和 col2 的长度,当第 1 列和第 2 列的值的长度超过 6 时,我想截断它并丢弃剩余的值。即我希望我的决赛桌如下所示:

col1            col2
Questi          Tags U
Value1          Value2      

实际上我想这样做的原因是,当我在 table1 上创建索引时,我收到以下错误:

错误:索引行大小 2744 超出索引“allstrings_string_key”的最大值 2712 提示:大于缓冲区页面 1/3 的值不能被索引。 考虑值的 MD5 散列的函数索引,或使用全文索引。

我知道我可以通过将值导入某种编程语言然后截断值来做到这一点。有什么方法可以让我在 postgres 中使用 sql 查询来达到同样的效果。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您不能将它们更新为仅包含最大长度为 6 的字符串吗?

    我不是 postrgres pro,所以这可能不是最好的方法,但无论如何都应该完成这项工作:

    UPDATE table1 SET col1 = SUBSTRING(col1, 1, 6) WHERE LEN(col1) > 6
    UPDATE table1 SET col2 = SUBSTRING(col2, 1, 6) WHERE LEN(col2) > 6
    

    【讨论】:

      【解决方案2】:

      我建议您实际上遵循 Postgres 的建议,而不是更改您的数据。显然,不应该对具有 2k 个字符长字符串的列进行索引——或者无论如何都不应该使用 btree 索引。

      如果索引背后的想法是搜索,请改用全文搜索:

      http://www.postgresql.org/docs/current/static/textsearch.html

      如果需求背后的想法是排序,请改用功能索引。例如:

      create index tbl_sort on (substring(col from 1 for 20));
      

      然后,不要按col 订购,而是按substring(col from 1 for 20) 订购。

      【讨论】:

      • 其实2712以后的数据对我来说用处不大..所以我要截断
      • 运行更新:update tbl set col = substring(col from 1 for 6)。但我认为您还应该研究该索引以及为什么它首先存在。
      【解决方案3】:

      您是否尝试将列的类型更改为CHAR 而不是VARCHAR

      ALTER TABLE table1
          ALTER COLUMN col1 SET DATA TYPE CHAR(6),
          ALTER COLUMN col2 SET DATA TYPE CHAR(6)
      

      如果你需要列是可变长度的,你可以指定一个限制(注意这是一个PostgreSQL扩展):

      ALTER TABLE table1
          ALTER COLUMN col1 SET DATA TYPE CHARACTER VARYING(6),
          ALTER COLUMN col2 SET DATA TYPE CHARACTER VARYING(6)
      

      【讨论】:

      • 坏主意:1. CHAR 的语义与 VARCHAR 不同。 2. 丢失数据。
      • OP 想要截断数据(即数据无论如何都会丢失,如提供的示例所示)。
      • 我在“DATA”处或附近遇到语法错误。非常感谢回复:)
      • @AliceEverett 我有一个错字,现在已修复。立即尝试(哪个版本最能满足您的需求)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 2019-10-10
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多