2013-10-21 25 views
1

列我在Postgres的如下表:SQL查询截断这在上面指定的长度

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的指数,然后我收到以下错误的原因:

ERROR: index row size 2744 exceeds maximum 2712 for index "allstrings_string_key" HINT: Values larger than 1/3 of a buffer page cannot be indexed. Consider a function index of an MD5 hash of the value, or use full text indexing.

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

回答

1

你不能只更新它们只包含字符串最大长度为6?

我没有postrgres亲,所以这可能不是最好的方法,但不管怎么说应该做的工作:

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

您是否尝试将列的类型更改为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) 
+0

坏主意:1. CHAR的语义不同于VARCHAR。 2.丢失数据。 –

+1

OP想要截断数据(即数据将会丢失,就像提供的示例中那样)。 –

+0

我在“DATA”处或附近发生语法错误。非常感谢回复:) –

1

我建议你实际遵循的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)

+0

实际上超出2712的数据对我来说没有多大用处,所以我想截断 –

+0

只需运行update:'update tbl set col = substring(col from 1 for 6)'。但是,你应该仔细研究一下这个索引,以及为什么它首先出现在那里。 –

+0

+1 ..非常感谢 –