SQL 中的文本列表

bab*_*jee 5 sql postgresql pattern-matching

有没有办法将逗号分隔的文本值转换为列表,以便我可以在 SQL 中将其与“IN”一起使用?我为此使用了 PostgreSQL。

前任。:

select location from tbl where 
location in (replace(replace(replace('[Location].[SG],[Location].[PH]', ',[Location].[', ','''), '[Location].[', ''''), ']',''''))
Run Code Online (Sandbox Code Playgroud)

这个查询:

select (replace(replace(replace('[Location].[SG],[Location].[PH]', ',[Location].[', ','''), '[Location].[', ''''), ']',''''))
Run Code Online (Sandbox Code Playgroud)

产生 'SG','PH'

我想产生这个查询:

select location from tbl where location in ('SG','PH')
Run Code Online (Sandbox Code Playgroud)

当我执行第一个查询时没有返回任何内容。该表已填充位置值“SG”和“PH”。

任何人都可以帮助我如何在不使用 PL/pgSQL 的情况下完成这项工作吗?

mu *_*ort 3

所以你面临着一个友好易于使用的工具,它不会让你完成任何工作,我感受到你的痛苦。

对您所结合的内容进行轻微修改string_to_array应该能够完成工作。

首先,我们将replace用更好的方式替换您的嵌套调用replace

=> select replace(replace(replace('[Location].[SG],[Location].[PH]', '[Location].', ''), '[', ''), ']', '');
 replace 
---------
 SG,PH
Run Code Online (Sandbox Code Playgroud)

因此,我们去掉[Location].噪音,然后去掉剩下的括号,以获得您要查找的两个字符位置代码的逗号分隔列表。还有其他方法可以SG,PH使用 PostgreSQL 的其他方法字符串和正则表达式函数,但replace(replace(replace(...对于具有特定结构的字符串来说效果很好。

然后我们可以使用以下命令将该 CSV 拆分为一个数组string_to_array

=> select string_to_array(replace(replace(replace('[Location].[SG],[Location].[PH]', '[Location].', ''), '[', ''), ']', ''), ',');
 string_to_array 
-----------------
 {SG,PH}
Run Code Online (Sandbox Code Playgroud)

为我们提供一系列位置代码。现在我们有了一个数组,我们可以= ANY使用IN查看数组内部:

=> select 'SG' = any (string_to_array(replace(replace(replace('[Location].[SG],[Location].[PH]', '[Location].', ''), '[', ''), ']', ''), ','));
 ?column? 
----------
 t
Run Code Online (Sandbox Code Playgroud)

t是一个布尔值 TRUE;如果你说'XX' = any (...)你会得到一个f(即FALSE)。

将所有这些放在一起,您将得到一个结构如下的最终查询:

select location
from tbl
where location = any (string_to_array(...))
Run Code Online (Sandbox Code Playgroud)

您可以自己填写...嵌套的肮脏内容。replace