我有一个数据库,其中一列包含数字。 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
但我无法成功更新数据库。任何想法如何使它工作?
答案 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)
(\d)
与$1.
,全球更复杂的正则表达式可以为您节省最后一步,例如通过预测。我不确定你的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。但这是下一个问题。
非常感谢大家!!