截断和更新数据库表中的字符串值

时间:2019-02-20 09:51:58

标签: sql postgresql

我有一个名为data的表的postgres数据库。例如,此表包含6个整数,其中3个是错误的:

data
-----------------
foo/bar/file1.txt
foo/bar/file2.txt
file3.txt
foo/bar/file4.txt
file5.txt
file6.txt

我正在寻找一种方法来剥离带有额外路径的3个文件,以使输出变为:

data
-----------------
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt

SUBSTRING(文件名,50,70) 我可以选择正确的结果,但是我无法确切弄清楚如何在表中重命名它们:SELECT substring(data, 9, 100) FROM db WHERE data LIKE 'foo/bar%';

3 个答案:

答案 0 :(得分:3)

您可能想要一个UPDATE。另外,最好使用SUBSTRING(file_name from 'foo/bar/(.*)$')而不是依靠字符长度。这可以帮助您仅通过更改模式而不计算长度即可重用查询。

UPDATE data SET file_name =  SUBSTRING(file_name from 'foo/bar/(.*)$')
where file_name LIKE 'foo/bar%';

Demo

答案 1 :(得分:2)

您可以将值转换为数组,然后选择该数组的最后一个条目。这样,您无需在更新语句中对文件路径进行硬编码:

update the_table 
   set data = (string_to_array(data, '/'))[cardinality(string_to_array(data, '/'))]
where strpos(file_name , '/') > 0

答案 2 :(得分:1)

这是获取/之后的最后一项的一种方法:

UPDATE *my_table* SET data =
    (string_to_array(data, '/'))[array_length(string_to_array(data, '/'), 1)];

因此,转换为数组的第二个转换是获取具有最后一个索引的数组的大小。