拆分逗号分隔的列表到一个临时表(splitting comma separated list int

2019-10-22 05:45发布

我要转换的按照查询到内部联接查询:

select country, name, rank from table person_details 
   where country in ('india','USA','australia') 
   and   name in ('tom', 'jill', 'jack') 
   and   rank in ('first', 'third', 'fifith');

我有两个问题:

  1. 这个表是大等都将改变这个IN查询到内部联接将加快东西。

  2. 什么将成为拆分此逗号在一些临时表分隔列表的列最佳途径。 我看到很多的正则表达式的例子,但他们似乎过于复杂和大。

我使用Oracle 11g数据库。

表快照:

Id   name   country   rank
 1    tom    india     first
 2    jill   USA      second
 3    jack   aus       first

Answer 1:

选择国家,姓名,从表person_details排名

查询语法不正确。 你并不需要的关键词表。 做就是了:

select country, name, rank from person_details

严格地说,你的表是不 。 你不应该多值存储在一列。 迟早你会看到性能问题。 它是永远不会太晚重新设计你的表和值存储在单独的列。

话虽如此,有很多方法可以逗号分隔字符串分割成行。 这里是一个使用REGEXP_SUBSTRINSTRCONNECT BY子句一个简单的方法:

SQL> WITH DATA AS(
  2  select q'['india','USA','australia']' countries,
  3  q'['tom', 'jill', 'jack']' names,
  4  q'['first', 'third', 'fifth']' ranks
  5  from dual
  6  )
  7  SELECT regexp_substr(translate(countries,'''',' '), '[^,]+', 1, LEVEL) countries,
  8  trim(regexp_substr(translate(names,'''',' '), '[^,]+', 1, LEVEL)) names,
  9  trim(regexp_substr(translate(ranks,'''',' '), '[^,]+', 1, LEVEL)) ranks
 10  FROM DATA
 11  CONNECT BY instr(countries, ',', 1, LEVEL - 1) > 0
 12  /

COUNTRIES                 NAMES                 RANKS
------------------------- --------------------- -------------------------
 india                    tom                   first
 USA                      jill                  third
 australia                jack                  fifth

SQL>

我已经证明了我的文章其它方式ORACLE DELIMITED字符串操作 。



文章来源: splitting comma separated list into a temp table