提问人:vikas chauhan 提问时间:12/23/2020 最后编辑:vikas chauhan 更新时间:12/23/2020 访问量:211
查询未读取表中存储的带引号的字符串值
Query not reading the quoted string values stored in the table
问:
我已将一些带引号的值存储在一个单独的表中,并基于此表中的值。我正在尝试过滤另一个表中的行 通过在子查询中使用此表中的值。但它不会读取子查询的值,而是在输出中返回一个空白表。
该值位于列中,并解析为 。override
'HCC11','HCC12'
当我只是从列中复制值并将其粘贴到子查询的位置时,它正在正确获取数据。我无法理解这里的问题。我尝试在这里使用该功能,但仍然不起作用trim()
注意-:我附上了图片供您参考:
select *
from table1
where column1 in (select override from table 2 )
答:
0赞
Taavi Tiitsu
12/23/2020
#1
根据您的图像,值必须为 (一个字符串) 才能从子查询中获取匹配项。
如果 有 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
);
评论
0赞
Popeye
12/23/2020
有了这个解决方案,将与HC11
'HC12','HC119
'
0赞
Taavi Tiitsu
12/23/2020
@Popeye,好点子!更新了答案。可能有多种更好的方法来设置子查询的条件。
0赞
12/23/2020
这是无效的 SQL。字符串常量需要用单引号括起来,是对列的引用"'"
0赞
Popeye
12/23/2020
#2
您有覆盖列值,因为它不能与单个值匹配。您最好按如下方式使用运算符:'HCC11','HCC12'
'HCC11'
LIKE
select * from table1 t1
where exists
(select 1 from table2 t2
where t2.override like concat('%''', t1.column1, '''%'));
0赞
Nikhil Patil
12/23/2020
#3
你可以像这样做 -
1.
select * from table1
where column1 in
(select regexp_replace(unnest(string_to_array(override, ',')),'''', '', 'g') from table2)
或
2.
select * from table1
where '''' || column1 || '''' in
(select unnest(string_to_array(override, ',')) from table2)
虽然,我只是建议不要像这样存储您的数据,因为您想使用它进行查询。
1赞
user330315
12/23/2020
#4
将逗号分隔值存储在一列中是一个非常糟糕的数据库,一开始将它们括在引号中会使事情变得更糟。问题的正确解决方案是更好的设计。
但是,如果您被迫使用该糟糕的设计,则可以使用
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'
)
评论
0赞
vikas chauhan
12/23/2020
我的表 1 的 column1 是我必须基于它进行子集的列。在表 2 的覆盖列的不同行中有 100 个这样的不同逗号分隔值值,如果表 1 中的记录包含这些值中的任何一个,那么我只需要该记录。有没有更好的方法来存储我从覆盖列中使用的这些值?
0赞
vikas chauhan
12/23/2020
顺便说一句!谢谢你的sol。 它奏效了.但是,如果有任何其他更好的主意来完成任务,我会努力的
评论
column1
HCC11
'HCC11'
table1.column1
listagg