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)