Sql 所以,在这个SELECT查询中使用INSERT语句。对不起,我读错了,把你的解决方案和另一个搞混了。如果我想用回车代替逗号,我该怎么做?有专门的代码吗?@ICERABIT-回车代码是chr(13)。但我还是不明白。数据是否在文本的单个列中,但文本本身(从外

Sql 所以,在这个SELECT查询中使用INSERT语句。对不起,我读错了,把你的解决方案和另一个搞混了。如果我想用回车代替逗号,我该怎么做?有专门的代码吗?@ICERABIT-回车代码是chr(13)。但我还是不明白。数据是否在文本的单个列中,但文本本身(从外,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,所以,在这个SELECT查询中使用INSERT语句。对不起,我读错了,把你的解决方案和另一个搞混了。如果我想用回车代替逗号,我该怎么做?有专门的代码吗?@ICERABIT-回车代码是chr(13)。但我还是不明白。数据是否在文本的单个列中,但文本本身(从外部视图看是“单个值”)实际上扩展到了多行,每行一个值?在那里要非常小心;如果输入来自Unix/Linux,则只有换行符(而不是回车符!)-这是chr(10),但如果输入来自Windows,则是回车符和换行符。但是,您使用什么来进行导入?所有这些


所以,在这个SELECT查询中使用INSERT语句。对不起,我读错了,把你的解决方案和另一个搞混了。如果我想用回车代替逗号,我该怎么做?有专门的代码吗?@ICERABIT-回车代码是
chr(13)
。但我还是不明白。数据是否在文本的单个列中,但文本本身(从外部视图看是“单个值”)实际上扩展到了多行,每行一个值?在那里要非常小心;如果输入来自Unix/Linux,则只有换行符(而不是回车符!)-这是
chr(10)
,但如果输入来自Windows,则是回车符和换行符。但是,您使用什么来进行导入?所有这些都应该在导入数据时进行处理,而不是在导入之后。因此,给我的数据似乎已经加载到表中。发生的事情是,对于每个唯一标识符,我有几个名字、姓氏和位置,都由一些我不确定的字符分隔。我可以在一列中收到的名字的一个例子是:CarlosMonta如果我们不插入数据,而是从“暂存”表中逐列选择数据,解决方案会发生变化吗?@Icelabit-我不理解这个问题。我提供的解决方案没有插入数据。你是说WITH子句吗?我非常清楚地将其标记为仅用于测试目的;您只需要上的
select id,
on中的代码,但必须使用暂存表的名称和其中的列。或者您正在询问如何存储此查询的结果?如果是这样,请在此SELECT查询中使用INSERT语句。对不起,我误读了,并将您的解决方案与其他解决方案混淆。如果我想用回车代替逗号,我该怎么做?有专门的代码吗?@ICERABIT-回车代码是
chr(13)
。但我还是不明白。数据是否在文本的单个列中,但文本本身(从外部视图看是“单个值”)实际上扩展到了多行,每行一个值?在那里要非常小心;如果输入来自Unix/Linux,则只有换行符(而不是回车符!)-这是
chr(10)
,但如果输入来自Windows,则是回车符和换行符。但是,您使用什么来进行导入?所有这些都应该在导入数据时进行处理,而不是在导入之后。因此,给我的数据似乎已经加载到表中。发生的事情是,对于每个唯一标识符,我有几个名字、姓氏和位置,都由一些我不确定的字符分隔。我可以在一列中收到的名字的一个例子是:CarlosMonta
First_Name (John,  ,Phil)
Last_Name  (Smith,No, ) 
Location  (CA,GA,NY)
(John, Smith, CA)
( , No, GA)
(Phil, ,NY)
SET SERVEROUTPUT ON;
DECLARE 

TYPE etype IS TABLE OF VARCHAR2(100);
erec etype;
BEGIN

 for rec IN  ( SELECT first_name,last_name,location FROM Table1 )
 LOOP

 WITH fname
     AS (SELECT LEVEL   lvl,
                REGEXP_SUBSTR(rec.first_name, '[^,]+', 1, LEVEL)First_name
         FROM   DUAL
         CONNECT BY REGEXP_SUBSTR(rec.first_name, '[^,]+', 1, LEVEL) IS NOT NULL),
     lname
     AS (SELECT LEVEL lvl,
                REGEXP_SUBSTR(rec.last_name, '[^,]+', 1, LEVEL)Last_Name
         FROM   DUAL
         CONNECT BY REGEXP_SUBSTR(rec.last_name, '[^,]+', 1, LEVEL) IS NOT NULL),
     loc
     AS (SELECT LEVEL lvl,
                REGEXP_SUBSTR(rec.location, '[^,]+', 1, LEVEL)Location
         FROM   DUAL
         CONNECT BY REGEXP_SUBSTR(rec.location, '[^,]+', 1, LEVEL) IS NOT NULL)
SELECT first_name
       ||','
       || last_name
       ||','
       || location  BULK COLLECT INTO erec 
FROM   fname fn
       FULL OUTER join lname ln
                    ON fn.lvl = ln.lvl
       FULL OUTER join loc lo
                    ON ln.lvl = lo.lvl;  

FOR i IN 1..erec.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE(erec(i));  
END LOOP;

END LOOP;     

END;
/
with
  inputs ( id, first_name, last_name, location ) as (
    select 101, 'John,,Phil' , 'Smith,No,'   , 'CA,GA,NY' from dual union all
    select 102, 'Jo,Al,Ed,Li', 'Ng,Tso,,Roth', ',ZZ,,BB'  from dual 
  )
-- End of simulated inputs (for testing only, not part of the solution).
-- SQL query begins BELOW THIS LINE. Use your actual table and column names.
select id,
       regexp_substr(first_name, '([^,]*)(,|$)', 1, level, null, 1) as first_name,
       regexp_substr(last_name , '([^,]*)(,|$)', 1, level, null, 1) as last_name,
       regexp_substr(location  , '([^,]*)(,|$)', 1, level, null, 1) as location
from   inputs
connect by level <= regexp_count(first_name, ',') + 1
       and prior id = id
       and prior sys_guid() is not null
;

  ID FIRST_NAME  LAST_NAME    LOCATION
---- ----------- ------------ --------
 101 John        Smith        CA      
 101             No           GA      
 101 Phil                     NY      
 102 Jo          Ng                   
 102 Al          Tso          ZZ      
 102 Ed                               
 102 Li          Roth         BB