1

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

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

如何选择忽略不在此表中的任何字符的列?

编辑1:假设这个表被称为“tb_abcd”并且想要从表“tb_users”中选择列“user_name”。

表格内容:

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

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

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

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

4

2 回答 2

1

如果我理解正确,您将使用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

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

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

于 2020-07-24T13:37:42.473 回答
0

只要您的 251 个字符都不会干扰正则表达式,这个愚蠢的解决方案应该可以工作。

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)
于 2020-07-24T13:38:00.760 回答