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)
我有一个 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)