如何在postgresql中合并两个长度相同的字符串?

ar5n3qh5  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(224)

例如,我有字符串oaaoaaaoaoao。我需要结果:ooaoao。也就是说,需要将行合并为一行。同时,保留行的公共部分,并将不匹配替换为符号
如何在Postgresql中做到这一点?
我试着这样做:

select 'text' | 'text'

但当然是操作失误

mzsu5hc0

mzsu5hc01#

您选择了错误的数据类型。您应该采用varbit而不是textvarchar,那么|就可以完成您想要的任务。您仍然可以通过将字符转换为0和1并将数据转换为`varit'来实现您的目标:

SELECT translate(
          CAST (
             CAST (translate('oaaoaa', 'ao', '01') AS varbit) |
             CAST (translate('aoaoao', 'ao', '01') AS varbit)
             AS text
          ),
          '01', 'ao'
       );

 translate 
═══════════
 ooaoao
(1 row)
m1m5dgzv

m1m5dgzv2#

这通过生成一系列长度来迭代字符串的每个字符位置,因此两个字符串必须具有相同的长度。如果位置中的任何字符为o,则o else a。

SELECT 
    STRING_AGG(
        CASE 
            WHEN POSITION('o' IN string1) = position OR POSITION('o' IN string2) = position THEN 'o'
            WHEN SUBSTRING(string1 FROM position FOR 1) = 'a' AND SUBSTRING(string2 FROM position FOR 1) = 'a' THEN 'a'
            ELSE 'o'
        END,
        ''
    ) AS result
FROM 
    (SELECT 'oaaoaa' AS string1, 'aoaoao' AS string2, generate_series(1, LENGTH('oaaoaa')) AS position) t
结果
奥奥奥

fiddle

相关问题