1

Students7 つの住所フィールドを含むテーブルがあります 。

住所フィールドにキャリッジ リターンがある場合は、 生徒ごとに 1 行ずつ表示する必要があります。

この後混乱。

9 番目の列( 1 番目の列-学生 ID2 ~ 8 列- 7 つの住所フィールド) には、キャリッジ リターン (カンマで区切られた各学生 ID の addr_1、addr_3、1 など) を持つ列名のリストが含まれている必要があります。

10 列目には、不正な文字(この場合はキャリッジ リターン) を 含める必要があります。

このコードは、特定された他の不正な文字にさらに拡張する必要があり、レポートを生成する必要があります。

9 列目と 10 列目は作業できません。誰でも助けることができますか?

SELECT pty.id,
a.addr_1,
a.addr_2,
a.addr_3,
a.addr_4,
a.addr_5,
a.addr_6,
a.addr_7
FROM addr a 
inner join contact cON a.idf = c.add_idf
inner join pty ON c.pty_id = pty.id
WHERE 
INSTR(a.addr_1,CHR(13)) > 0 OR
INSTR(a.addr_2,CHR(13)) > 0 OR
INSTR(a.addr_3,CHR(13)) > 0 OR
INSTR(a.addr_4,CHR(13)) > 0 OR
INSTR(a.addr_5,CHR(13)) > 0 OR
INSTR(a.addr_6,CHR(13)) > 0 OR
INSTR(a.addr_7,CHR(13)) > 0;
4

3 に答える 3

1

9列目はcase when instr(...) then 1 else 0 end || case when instr(...) then

create table tmp (vc varchar2(20),  vc2 varchar2(20));
insert into tmp values ('abcd','bcda');
insert into tmp values ('bcd','bcda');

select 
  case when instr(vc,'a')>0 then 'col1' else null end ||
  case when instr(vc2,'a')>0 then 'col2' else null end 
from tmp;

'RETURN'2 番目の問題については、10 列目に入れるだけです。禁止された文字を 1 つだけ探して、それを含む行のみを取得するためです。いくつかの禁止された文字を扱う解決策を思いついたら、更新します.

于 2013-01-18T13:56:58.960 に答える
1

これは宿題の質問のように聞こえます。では、ヒントをいくつか教えてください。

(1) 次のような構文を使用してテーブルを生成できます。

select chr(13) as badchar from dual union all
select '!' . . .

(2)cross joinこれをテーブルに入れ、非常によく似たwhere句を使用できます。

(3) 次に、表から悪い文字を選択できます。

(4) アグリゲーションが必要です。

実際には、学生ごとに 1 つの行の要件を削除し、代わりに学生/悪い文字ごとに 1 つの行を作成する傾向があります。アプローチは次のとおりです。

select a.id,
       a.addr_1, a.addr_2, a.addr_3, a.addr_4, a.addr_5, a.addr_6, a.addr_7,
       ((case when INSTR(a.addr_1, b.badChar) > 0 then 'addr_1,' else '' end) ||
        (case when INSTR(a.addr_2, b.badChar) > 0 then 'addr_2,' else '' end) ||
        (case when INSTR(a.addr_3, b.badChar) > 0 then 'addr_3,' else '' end) ||
        (case when INSTR(a.addr_4, b.badChar) > 0 then 'addr_4,' else '' end) ||
        (case when INSTR(a.addr_5, b.badChar) > 0 then 'addr_5,' else '' end) ||
        (case when INSTR(a.addr_6, b.badChar) > 0 then 'addr_6,' else '' end) ||
        (case when INSTR(a.addr_7, b.badChar) > 0 then 'addr_7,' else '' end)
       ) as addrs,
       b.badChar
from a cross join
     (select chr(13) as badChar from dual) as b
WHERE INSTR(a.addr_1, b.badChar) > 0 OR
      INSTR(a.addr_2, b.badChar) > 0 OR
      INSTR(a.addr_3, b.badChar) > 0 OR
      INSTR(a.addr_4, b.badChar) > 0 OR
      INSTR(a.addr_5, b.badChar) > 0 OR
      INSTR(a.addr_6, b.badChar) > 0 OR
      INSTR(a.addr_7, b.badChar) > 0;

列名の最後に余分なコンマが残ります。これをサブクエリにして、次のレベルで文字列操作を行うことで、これを取り除くことができます。

すべての badchars を 1 行に配置するには、集約が必要になります。ただし、その場合、9 列目と 10 列目に何が含まれるかはわかりません。

于 2013-01-18T13:57:57.160 に答える
0

同様の状況で、Big Hammer を使用して、REGEXP_LIKE(col1,'[:cntrl:]') で非印刷制御コードを検出しました。次の誰かがタブまたはデータを壊す何かを追加するからです。

これが起こらないようにするために、チェック制約を列に配置するように要求するのは多すぎますか?

于 2013-01-18T21:05:44.830 に答える