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

Query not reading the quoted string values stored in the table

提问人:vikas chauhan 提问时间:12/23/2020 最后编辑:vikas chauhan 更新时间:12/23/2020 访问量:211

问:

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

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

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

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

enter image description here

select * 
from table1 
where column1 in (select override  from table 2 )
SQL 字符串 PostgreSQL 行情

评论

0赞 12/23/2020
它的内容到底是什么?它是单个值吗?它是否也包括单引号,例如 .g. 或 ?column1HCC11'HCC11'
0赞 vikas chauhan 12/23/2020
请参阅随附的快照。值为“HCC11,'HCC12'。可以有多个用逗号分隔的单引号值。我正在使用 IN() 运算符根据这些多个值过滤记录
0赞 12/23/2020
我说的是(不是覆盖列) - 包含什么?table1.column1
0赞 user_stack_overflow 12/23/2020
提示:listagg

答:

0赞 Taavi Tiitsu 12/23/2020 #1

根据您的图像,值必须为 (一个字符串) 才能从子查询中获取匹配项。 如果 有 2 行带有值,则可以在子查询中使用该关键字。 类似的东西table1.column1'HCC11','HCC12'table1HCC11HCC12exists

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。 它奏效了.但是,如果有任何其他更好的主意来完成任务,我会努力的