Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写此sql查询-用另一个表中的匹配值替换字符串中的每个单词_Java_Sql_Oracle - Fatal编程技术网

Java 如何编写此sql查询-用另一个表中的匹配值替换字符串中的每个单词

Java 如何编写此sql查询-用另一个表中的匹配值替换字符串中的每个单词,java,sql,oracle,Java,Sql,Oracle,我有两张桌子: 表1: column1 column2 1 TARA JENK ERIK MURP 2 MATH SIER SHCK ELCP SBAR 3 CELN KRAB 表2: ID NAME 345 TARA 084 JENK 875 ERIK 345 MURP 现在,我想在Java中查询要调用的数据,以便得到表1,其中column2的每个单词都被表2中匹配的ID替换 这方面的SQL是可行的 提前感谢, 干杯 编辑: 预期

我有两张桌子:

表1:

column1 column2
1       TARA JENK ERIK MURP
2       MATH SIER SHCK ELCP SBAR
3       CELN KRAB 
表2:

ID    NAME
345   TARA
084   JENK
875   ERIK
345   MURP
现在,我想在Java中查询要调用的数据,以便得到表1,其中column2的每个单词都被表2中匹配的ID替换

这方面的SQL是可行的

提前感谢,

干杯

编辑: 预期产出:

column1  column2
1        345 084 875 435
2        980 245 352 355 425
3        523 233

以下是实现所需功能的代码:

with words(id, word, rest, lev) as (
      select column1 as id,
             substr(column2, 1, instr(column2, ' ') - 1) as word,
             substr(column2, instr(column2, ' ') + 1) as rest,
             1 as lev
      from table1
      union all
      select id,
             (case when rest like '% %'
                   then substr(rest, 1, instr(rest, ' ') - 1)
                   else rest
              end) as word,
             (case when rest like '% %'
                   then substr(rest, instr(rest, ' ') + 1)
              end) as rest,
             lev + 1
      from words
      where rest is not null
     )
select w.id,
       listagg(coalesce(cast(t2.id as varchar2(255)), w.word), ' ') within group (order by w.lev)
from words w left outer join
     table2 t2
     on w.word = t2.name 
group by w.id;

是一个SQL小提琴,演示了它的工作原理。

这是我的函数版本

create or replace function txt_to_id(p_id number)
return varchar2 as
--SET serveroutput ON
--DECLARE
v_string VARCHAR2(100);
v_loc    NUMBER := 0;
v_slice  VARCHAR2(100);
v_id     NUMBER;
v_output VARCHAR2(100);
BEGIN
  SELECT column2 INTO v_string FROM table1 WHERE column1 = p_id;
  --dbms_output.put_line('length v_string: '||LENGTH(v_string));
  --dbms_output.put_line('v_loc: '||v_loc);
  WHILE v_loc < LENGTH(v_string)
  LOOP
    --slice the string by find the space between
    v_slice := trim(SUBSTR(v_string, v_loc, instr(v_string,' ')));
  BEGIN
     SELECT id INTO v_id FROM table2 WHERE upper(name) LIKE upper(v_slice);
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
     --dbms_output.put_line('Error Code: '|| SQLCODE||'-'||SQLERRM);
     v_output := v_output||' '||0;

  END;
  v_output := v_output||' '||v_id;
  --dbms_output.put_line('v_loc:'||v_loc);
  --dbms_output.put_line('v_slice:'||trim(v_slice));
  v_loc := v_loc+LENGTH(v_slice)+1;
END LOOP;
--dbms_output.put_line('v_output: '|| v_output);
return v_output;
END;
结果:

column2                      txt_to_id(column1)
TARA JENK ERIK MURP          345 84 875 346
MATH SIER SHCK ELCP SBAR     0  0  0  0  0 
CELN KRAB                    0  0 
以数据为基础

create table table1(column1 number(9), column2 varchar2(100)); 

insert into table1
select  1, 'TARA JENK ERIK MURP' from dual union all
select  2, 'MATH SIER SHCK ELCP SBAR' from dual union all
select  3, 'CELN KRAB' from dual;

create table table2(IDS NUMBER(9), NAMES VARCHAR2(100));

insert into table2
select 345, 'TARA' from dual union all
select 084, 'JENK' from dual union all
select 875, 'ERIK' from dual union all
select 345, 'MURP' from dual union all
select 456, 'MATH' from dual union all
select 678, 'SIER' from dual union all
select 890, 'SHCK' from dual union all
select 123, 'ELCP' from dual union all
select 444, 'SBAR' from dual union all
select 666, 'CELN' from dual union all
select 888, 'KRAB' from dual;
使用查询

with tab1 as (select column1, 
                     regexp_substr(column2, '[^[:space:]]+', 1, level) element,
                     level seq
                from table1
               connect by regexp_substr(column2, '[^[:space:]]+', 1, level) is not null
                 and prior column2 = column2
                 and prior sys_guid() is not null)
select column1,
       listagg(ids, ' ') within group (order by seq) id,
       listagg(names, ' ') within group (order by seq) names
  from table2 join tab1 on (names = element)
 group by column1;
输出:

| COLUMN1 |                  ID |                    NAMES |
|---------|---------------------|--------------------------|
|       1 |      345 84 875 345 |      TARA JENK ERIK MURP |
|       2 | 456 678 890 123 444 | MATH SIER SHCK ELCP SBAR |
|       3 |             666 888 |                CELN KRAB |

Oracle 10的版本:

select 
 column1, replace(s,chr(0)) column2
from (
 select 
 column1, (select count(0) from table2) n,
 regexp_replace(column2,'(\S+)',chr(0)||'\1'||chr(0)) s
 from table1
)
model reference a on (
 select rownum n, chr(0)||name||chr(0) name, id
 from table2
) dimension by (n) measures (name, id)
partition by (column1) dimension by (0 x) measures (s,n)
rules iterate(999) until (n[0]=0) 
(s[0]=replace(s[0],name[n[0]],id[n[0]]), n[0]=n[0]-1)
order by column1

请显示预期输出。你的问题不清楚。这在SQL中是可能的,但相当复杂。您是否考虑过对第一个表使用关系数据结构?这将是每个实体/单词一行。将列表存储在字符串中是个坏主意。@OldProgrammer:添加了预期的输出。@GordonLinoff:是的,我们添加了,不适用于此特定实现,也不适用于my controla函数将执行此操作。在SQL developer中检查了您的查询,它不能按要求工作。它可以在SQL Fiddle上工作。这是另一个例子。无法从工作网络访问SQL Fiddle,稍后将进行检查。但是,我们已经在SQLDeveloper上仔细检查了它,它在那里不起作用。不过这相当复杂,让我看看是否可以按照您的建议将表重新创建为关系表。(规范化)您的Oracle版本可能不支持递归CTE或字符串聚合的
listagg()
。是的,它似乎按照我的问题的要求工作。但我已经开始重新制作桌子了。谢谢。总是很好的尝试!:)谢谢,不过还是不要找函数。只是SQL。
select 
 column1, replace(s,chr(0)) column2
from (
 select 
 column1, (select count(0) from table2) n,
 regexp_replace(column2,'(\S+)',chr(0)||'\1'||chr(0)) s
 from table1
)
model reference a on (
 select rownum n, chr(0)||name||chr(0) name, id
 from table2
) dimension by (n) measures (name, id)
partition by (column1) dimension by (0 x) measures (s,n)
rules iterate(999) until (n[0]=0) 
(s[0]=replace(s[0],name[n[0]],id[n[0]]), n[0]=n[0]-1)
order by column1