如何在Postgresql中遍历字符串的字符?

6
我需要在PostgreSQL中创建一个函数来显示作为参数传递的字符串的成对字符。
我打算遍历该字符串的字符,就像我在C、Java或其他语言中所做的那样,但我不知道如何单独访问字符,例如str[i],其中str是字符串,而i是字符的位置。
我所谓的“成对字符”是指位于成对位置的字符:即字符串中的位置模2 = 0的字符。如果输入参数是“String”,则该函数显示的字符将为“t”(即位置2,从位置1开始),以及“i”(即位置4), “g”(位置6)。

1
寻找SUBSTRING函数。 - Tripp Kinetics
请展示一些输入和期望的输出结果。另外,为什么要这样做?你试图解决的潜在问题是什么? - Craig Ringer
@Craig Ringer,除了我描述的问题外,没有其他问题。我现在正在学习PostgreSQL,这只是一个简单的练习;) 函数输入和输出的示例如下:“FunctionPairChars('thisIsAString')” 输出:hssSrn - xecollons
2个回答

10

数组迭代(最佳方法):

FOREACH ch IN ARRAY regexp_split_to_array('hello', '')
LOOP
  ...
END LOOP;

遍历表格:

FOR row_record IN
  SELECT tbl.col
  FROM regexp_split_to_table('hello', '') AS tbl(col)
LOOP
  ...
END LOOP;

将迭代表格 tbl 的列 col

 col
-----
 h
 e
 l
 l
 o
(5 rows)

访问row_record.col上的值。


不确定为什么要在字符串上“迭代”。这样的任务在编程语言中完成会更好。


1
我认为这对我的函数非常好!谢谢!我会在今天下午尝试,如果有效,我会将您的答案标记为正确答案。至于我如何在PostgreSQL中编写它,正如我所说,这是一本书中的简单练习,并且那就是规定。 - xecollons
我有一个非常类似的问题。我想通过一个字符串进行循环,但是我对此感到困惑...在数组regexp_split_to_array('hello', '')中,使用FOREACH ch IN循环 LOOP ... END LOOP;如果你能提供一个例子,那将非常有帮助。 - Lauro235

3
你的问题描述非常不清晰,很难猜出你真正想要什么。
假设你需要一些字符对,使得输入字符串“abcd”返回“ab,bc,cd”。这是根据提供的模糊描述所能猜到的最好答案之一。
如果这就是你想要的,那么下面是一个可能的解决方案:
CREATE OR REPLACE FUNCTION charpairs(text) RETURNS SETOF text AS $$
SELECT substring($1 from x for 2) FROM generate_series(1, length($1)-1) x;
$$
LANGUAGE sql
IMMUTABLE;

使用方法:

regress=> SELECT * FROM charpairs('abcd');
 charpairs 
-----------
 ab
 bc
 cd
(3 rows)

不是你想要的吗?正确定义问题。在编程中通常有一半的挑战是正确定义问题。一旦你做得好,代码往往几乎自己写出来了。从输入和输出开始。从末端到中间逐步解决。


更新评论后:

你想要字符 position%2 == 1。所以一种方法是:

CREATE OR REPLACE FUNCTION everysecond(text) RETURNS SETOF text AS $$
SELECT substring($1 from x for 1) FROM generate_series(2, length($1), 2) x;
$$
LANGUAGE sql
IMMUTABLE;

如果您想要一个字符串而不是一个集合作为结果,可能需要在其中使用string_agg


1
我的错,有时用英语表达起来很难,因为这不是我的母语。对此感到抱歉。我所说的“成对字符”是指“成对位置上的字符”,也就是字符串中位置 MOD 2 = 0 的字符。正如我所说,如果输入参数是“String”,则函数显示的字符将是“t”(从位置1开始的第2个位置),“i”(位置4),“g”(位置6)。无论如何,还是谢谢你的帮助。 - xecollons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接