【问题标题】:multiple selection in single query oracle单个查询oracle中的多项选择
【发布时间】:2015-07-10 22:30:11
【问题描述】:
CREATE TABLE CENSUS_MSA_DROPDOWN (
  OID  number(15),
  CityName  VARCHAR(60) CONSTRAINT census_msa_dropdown_pk PRIMARY KEY,
  StateCode CHAR(2));


select OID,SUBSTR(Basename,1, INSTR(Basename,',',1)-1),
substr(basename,LENGTH(basename)-1,2)
from CENSUS_MSA;

结果:

263904755925760 加利福尼亚州阿纳海姆-圣安娜-欧文

那么如何使用多项选择将每个城市分隔在一行中 喜欢:加利福尼亚州阿纳海姆 加利福尼亚州圣安娜 加州尔湾

【问题讨论】:

  • 嗯,可以用连字符分割字符串;在这种情况下,它们都处于一种状态,因此您可以在名称中的每个子字符串的末尾添加状态。但是您会如何处理“Fayetteville-Springdale-Rogers, AR-MO”——三个城市名称但只有两个州?哪个州属于哪个城市?
  • stackoverflow.com/questions/26407538/… 给出了如何进行条带分割的想法
  • 我的问题是我们如何使用子字符串和多选查询将每个州的每个城市分隔在一行中?

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

根据您的示例数据和所需的输出,实际上您希望在Anaheim-Santa Ana-Irvine 之类的字符串中提取- 之间的值,然后将它们与CA 之类的值连接起来,因此您提到的结果应该是:

Anaheim   CA
Santa Ana CA
Irvine    CA

在这些场景中使用 regx_substr 非常有用,您可以通过将提取的值与生成的 id 列表(表)交叉连接来获得结果,其中包含复杂字符串中值的数量:

SQL> create table strTable(complexStr varchar(100),strId varchar(5));

Table created.

SQL> insert into strTable values('Anaheim-Santa Ana-Irvine','CA');

1 row created.

SQL> commit;

Commit complete.

SQL> select trim(regexp_substr(t.complexStr, '[^-]+', 1, ids.column_value)) city,
  2  t.strId state
  3  from strTable t
  4  cross join
  5  table (cast (multiset
  6  (select level from dual connect by level <= regexp_count(t.complexStr, '-')+1)
  7  AS sys.odciNumberList)) ids;

CITY        STATE
--------------------   
Anaheim     CA

Santa Ana   CA

Irvine      CA


SQL> drop table strTable;

Table dropped.

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2021-09-27
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多