数据库中的regexp_replace反转数字字符串并在每个数字之间插入一个句点

时间:2010-01-08 11:05:24

标签: mysql regex postgresql

我有一个数据库,其中一列包含数字。 3个示例值:

1111111555
2222222555
3333333555

我需要反转并在每个数字之间加一个点。即上述每个例子的结果都是:

5.5.5.1.1.1.1.1.1.1
5.5.5.2.2.2.2.2.2.2
5.5.5.3.3.3.3.3.3.3

分别

然后我需要用结果更新另一列。我该如何替换?

在线正则表达式测试为我提供了我需要的结果:

(\S)(\S)(\S)(\S)(\S)(\S)(\S)(\S)(\S)(\S)/g$10.$9.$8.$7.$6.$5.$4.$3.$2.$1

但我无法成功更新数据库。任何想法如何使它工作?

5 个答案:

答案 0 :(得分:2)

PostgreSQL的正确答案:

CREATE OR REPLACE FUNCTION reverse_array(ANYARRAY) RETURNS ANYARRAY AS $$
    SELECT array( (SELECT $1[i] FROM generate_series( array_upper($1, 1), array_lower($1, 1), -1 ) i ) );
$$ language sql;

# select array_to_string(
    reverse_array(
        regexp_split_to_array( i, '' )
    ), '.'
  )
  from (values ('1111111555'), ('2222222555'), ('3333333555')) x (i);
   array_to_string
---------------------
 5.5.5.1.1.1.1.1.1.1
 5.5.5.2.2.2.2.2.2.2
 5.5.5.3.3.3.3.3.3.3
(3 rows)

答案 1 :(得分:1)

  1. 通过常规手段(即内置字符串函数)反转字符串
  2. 正则表达式替换(\d)$1.,全球
  3. 从结果中删除最后一个点
  4. 更复杂的正则表达式可以为您节省最后一步,例如通过预测。我不确定你的DBMS在这里支持什么,所以我保持简单。

答案 2 :(得分:0)

在Oracle中,假设您的起始值位于名为f的列中,您可以执行以下操作:

substr(regexp_replace(reverse(f), '(\d)', '\1.'), 0, (length(f) * 2) - 1)

这是使用Tomalek

概述的方法

当然,如果您知道原始值总是恰好是10位数,那么您可以用19来代替(length(f) * 2) - 1

MySQL具有执行正则表达式匹配的功能,但不支持正则表达式替换,因此您需要依次对每个数字0-9进行嵌套替换。例如1-3:

replace(replace(replace(reverse(f), '3', '3.'), '2', '2.'), '1', '1.')

答案 3 :(得分:0)

类似的东西:

SELECT regexp_replace(reverse(yourcol), E'(\\S)(?=\\S)', E'\\1.', 'g')

应该有效。并且要更新,当然

UPDATE yourtable SET yourcol=regexp_replace(...)

答案 4 :(得分:0)

我正在尝试oracle: 选择   REGEXP_REPLACE(REVERSE(电话), '(\ d)', '\ 1。') 来自记录

4.3.2.1.1.1.1.1.1.1.1.1。

这对我来说很好,即使是最后一个点也很有用,我将附上e164.arpa 与concat。但这是下一个问题。

非常感谢大家!!