仅选择一组特定的字符(postgresql)

xpszyzbs  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(199)

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

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

我如何选择一个列忽略不在此表中的任何字符?
编辑1:假设这个表名为“tb\u d”,a希望从表“tb\u users”中选择列“user\u name”。
表格内容:

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

预期输出(基于“tb\u d”中的字符集):

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

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

8mmmxcuj

8mmmxcuj1#

只要251个字符中没有一个干扰regex,这个愚蠢的解决方案就应该有效。

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)
uqcuzwp8

uqcuzwp82#

如果我理解正确,你会用 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

注意:您需要注意正则表达式中是否有任何字符有效。你的样本数据不是这样的。
这是一把小提琴。这将返回与您指定的不同的结果--我不知道这些结果来自何处。这和你描述的一样。

相关问题