4

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

前任。:

select location from tbl where 
location in (replace(replace(replace('[Location].[SG],[Location].[PH]', ',[Location].[', ','''), '[Location].[', ''''), ']',''''))

这个查询:

select (replace(replace(replace('[Location].[SG],[Location].[PH]', ',[Location].[', ','''), '[Location].[', ''''), ']',''''))

产生'SG','PH'

我想产生这个查询:

select location from tbl where location in ('SG','PH')

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

谁能在不使用 PL/pgSQL 的情况下帮助我完成这项工作?

4

3 回答 3

2

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

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

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

=> select replace(replace(replace('[Location].[SG],[Location].[PH]', '[Location].', ''), '[', ''), ']', '');
 replace 
---------
 SG,PH

所以我们[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}

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

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

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

将所有这些放在一起可以为您提供如下结构的最终查询:

select location
from tbl
where location = any (string_to_array(...))

您可以自己填写...嵌套的replace讨厌。

于 2013-02-14T04:03:24.350 回答
1

假设我们正在处理表单中以逗号分隔的元素列表[Location].[XX],我希望这个结构表现最好:

SELECT location
FROM   tbl
JOIN  (
    SELECT substring(unnest(string_to_array(
             '[Location].[SG],[Location].[PH]'::text, ',')), 13, 2) AS location
    ) t USING (location)

一步步

  • 将逗号分隔的列表转换为数组,并将其拆分为带有unnest(string_to_array(...)).
    您可以对以下内容执行相同操作:regexp_split_to_table()。稍短,较长的字符串较慢。

  • 用提取XX部分substring()。非常简单和快速。

  • JOINtotbl而不是IN表达式。应该更快。
    我分配列别名location以启用等值连接USING (..)

于 2013-02-14T09:11:40.797 回答
0

直接使用('某物')中的位置有效

我创建了一个在列IN上使用子句的小提琴VARCHAR

http://sqlfiddle.com/#!12/cdf915/1

于 2013-02-14T02:50:47.140 回答