显示包含回车符的列

时间:2013-01-18 13:32:06

标签: sql oracle plsql carriage-return

我有一个Students表,其中包含7个地址字段。

我需要为学生显示 1行,其中地址字段有回车符号(如果有)。

此后很困惑。

第9列第1列 - 学生ID 2-8列 - 7地址字段)必须包含具有回车符的列名列表(如addr_1,addr_3,每个用逗号分隔的学生ID为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;

3 个答案:

答案 0 :(得分: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'放在第10列。因为你只寻找一个禁止的角色,只获得拥有它的线条。 当你想出一个处理几个禁止字符的解决方案时,我会更新。

答案 1 :(得分:1)

这听起来像是一个家庭作业问题。所以,让我给你一些提示:

(1)您可以使用语法生成表格,例如:

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

(2)您可以cross join进入表格并使用非常相似的where条款。

(3)然后,您可以从表中选择坏字符。

(4)你需要聚合。

实际上,我倾向于放弃每个学生一行的要求,而是每个学生/坏人物一行。这是一种方法:

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放在一行上需要聚合。但是,在这种情况下,我不清楚第9和第10列会包含什么。

答案 2 :(得分:0)

在类似的情况下,我去了一个Big Hammer,只是用REGEXP_LIKE(col1,'[:cntrl:]')检测到非打印控制代码,因为下一个人会添加一个标签或其他一些打破数据

要求对列进行检查约束以防止这种情况发生是否太过分了?