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 的情况下完成这项工作吗?
所以你面临着一个友好且易于使用的工具,它不会让你完成任何工作,我感受到你的痛苦。
对您所结合的内容进行轻微修改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
| 归档时间: |
|
| 查看次数: |
7670 次 |
| 最近记录: |