我有一个Students表,其中包含7个地址字段。
我需要为学生各显示1行,其中地址字段有回车返回(如果有的话)。
这之后就搞不清楚了。
第9列(第1列-学生证,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;发布于 2013-01-18 13:57:57
这听起来像个家庭作业问题。那么,让我给你一些提示:
(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;它在列名的末尾留了一个额外的逗号。这可以通过使其成为子查询并在下一级别执行字符串操作来删除。
要将所有的坏字符放在一行上,就需要进行聚合。然而,在这种情况下,我不清楚第9和第10列将包含什么内容。
发布于 2013-01-18 13:56:58
第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列中。因为你只寻找一个被禁止的字符,并且只得到有它的行。当您想出一个解决方案来处理几个被禁止的字符时,我会更新。
发布于 2013-01-18 21:05:44
在类似的情况下,我选择了一个大锤子,只是用一个REGEXP_LIKE(col1,':cntrl:')检测到了非打印控制代码,因为接下来有人会添加一个选项卡或其他什么东西来破坏数据。
要求在列上设置检查约束以防止发生这种情况是否太过了?
https://stackoverflow.com/questions/14400023
复制相似问题