Sql 查询未读取表中存储的带引号的字符串值

Sql 查询未读取表中存储的带引号的字符串值,sql,string,postgresql,quotes,Sql,String,Postgresql,Quotes,我在一个单独的表中存储了一些带引号的值,并基于此表中的值。我正在尝试筛选另一个表中的行 在子查询中使用此表中的值。但它不会读取子查询的值,并在输出中返回一个空白表 该值位于列override中,并解析为'HCC11','HCC12' 当我只是从列中复制值并将其粘贴到子查询的位置时,它正确地获取了数据。我无法理解这里的问题。我尝试过在这里使用trim()函数,但仍然不起作用 注-:我已附上图片供您参考: select * from table1 where column1 in (select

我在一个单独的表中存储了一些带引号的值,并基于此表中的值。我正在尝试筛选另一个表中的行 在子查询中使用此表中的值。但它不会读取子查询的值,并在输出中返回一个空白表

该值位于列
override
中,并解析为
'HCC11','HCC12'

当我只是从列中复制值并将其粘贴到子查询的位置时,它正确地获取了数据。我无法理解这里的问题。我尝试过在这里使用
trim()
函数,但仍然不起作用

注-:我已附上图片供您参考:

select * 
from table1 
where column1 in (select override  from table 2 )


根据您的图像,
table1.column1
的值必须是
'HCC11','HCC12'
(一个字符串)才能从子查询中获得匹配。 如果
table1
有两行的值分别为
HCC11
HCC12
,则可以在子查询中使用
exists
关键字。 差不多

select * 
 from table1 t1 
where exists 
  (select 1 
   from table2 t2 
   where instr( t2.override, concat("'",t1.column1,"'") ) >=1 
  );

您的覆盖列值为
'HCC11','HCC12'
,它不能与单个值
'HCC11'
匹配。您最好使用
LIKE
操作符,如下所示:

select *  from table1 t1 
where exists 
  (select 1 from table2 t2 
   where t2.override like concat('%''', t1.column1, '''%'));
你可以这样做-

一,

二,


尽管如此,我还是建议您不要这样存储数据,因为您希望使用它进行查询。

将逗号分隔的值存储在一列中是一个非常糟糕的数据库,首先将它们括在引号中会让事情变得更糟。解决问题的正确方法是更好的设计

但是,如果您被迫使用这种糟糕的设计,您可以使用

select *
from table1
where column1 in (select trim(both '''' from w.word)
                  from table2 t2
                    cross join unnest(string_to_array(t2.override, ',')) as w(word)

这假设
table1.column1
只包含一个没有任何引号的值,并且覆盖值在实际值中从不包含逗号(例如,上面的值会在
'a,B','C'
这样的值上断开)

使用此解决方案
HC11
将与
'HC12','HC119
匹配。@Popeye,很好!更新了答案。可能有多种更好的方法来设置子查询的条件。这是无效的SQL。字符串常量需要用单引号括起来。是对列的引用。
column1
的具体内容是什么?它是单一值吗?它是否也包括单引号,例如
HCC11
'HCC11'
?请参阅随附的快照。值为'HCC11,'HCC12'。可以有多个用逗号分隔的单引号值。我正在使用IN()运算符根据这些多个值筛选记录我正在谈论的是
table1.column1
(不是覆盖列)-它包含什么?提示:
listag
我的表1的column1是一个列,我必须根据它对其进行子集。在表2的override列的不同行中有100个这样不同的逗号分隔值,如果表1中的记录包含这些值中的任何一个,那么我只需要这些记录。有没有更好的方法来存储我在override列中使用的这些值?顺便说一句!谢谢你的信。成功了。但是如果有其他更好的办法来完成任务,我会努力的
select * from table1 
where '''' || column1 || '''' in
(select unnest(string_to_array(override, ',')) from table2)
select *
from table1
where column1 in (select trim(both '''' from w.word)
                  from table2 t2
                    cross join unnest(string_to_array(t2.override, ',')) as w(word)