SELECT 只有一组特定的字符 (PostgreSQL)

SELECT only a specific set of characters (PostgreSQL)

我有一个 table 包含一组特定字符的值,它是十进制和十六进制等价物。

/-------------------------\
|value|decimal|hexadecimal|
|-------------------------|
|    a|     97|       0061|
|    b|     98|       0062|
|    c|     99|       0063|
|    d|    100|       0064|
|-------------------------|

如何 select 列忽略不在此 table 中的任何字符?

编辑 1:假设这个 table 被称为“tb_abcd”并且想要 select 来自 table 的列“user_name” tb_users".

Table内容:

/---------\
|user_name|
|---------|
| Samuel  |
| Paul    |
| Chris   |
|---------|

预期输出(基于“tb_abcd”的字符集):

/---------\
|user_name|
|---------|
|    A    |
|    A    |
|    C    |
|---------|

我知道这是一个愚蠢的例子,但原来的 table 有一组 251 个字符。

如果我理解正确的话你会使用 regexp_replace():

select regexp_replace(t.user_name, r.regex, '', 'g')
from t cross join lateral
     (select '[^' || string_agg(value, '') || ']' as regex
      from content
     ) r

注意:您需要注意正则表达式中是否有任何字符有效。您的样本数据并非如此。

Here 是一个 db<>fiddle。这 returns 与您指定的结果不同——我无法弄清楚这些是从哪里来的。这确实符合您的描述。

只要您的 251 个字符中的 none 干扰正则表达式,这个愚蠢的解决方案就应该有效。

with keeps as (
  select string_agg(value, '') as letters
    from tb_abcd 
)
select *, 
       upper(regexp_replace(u.user_name, '[^'||k.letters||']', '', 'gi'))
  from tb_users u
 cross join keeps k;

 user_name | letters | upper 
-----------+---------+-------
 Samuel    | abcd    | A
 Paul      | abcd    | A
 Chris     | abcd    | C
(3 rows)