【问题标题】:Check string for numbers and characters in Oracle 11G在 Oracle 11G 中检查字符串中的数字和字符
【发布时间】:2015-07-30 11:05:12
【问题描述】:

我正在做某事。我必须检查一个字符串以进行验证。这个字符串有一个国家代码和一个大学代码(来自他们自己在数据库中的表)和一堆数字。现在我需要验证这个字符串。我需要检查国家代码和大学代码上的这个字符串,如果它有数字是或否。

目前我已经尝试了很多东西。我尝试使用很多 if 语句、regexp_like、instr、substr、select 语句等。但我无法检查字符串的国家和大学代码(以及是否有匹配的数字)。

我现在的代码如下:

create or replace function checkForCorrectness (
  isin varchar2)
return integer
as
  isCorrect integer := 0;
  checkISIN varchar2(50);
  checkCountryCode country.code%type;
  checkUniversityCode university.code%type;

  e_onbekendeLandCode exception;
  e_onbekendeUniCode exception;
  e_lengteNummer exception;
begin
 --checkISIN := isin;
 /*
 if checkISIN like '%NL%'
 then dbms_output.put_line('Beschikt over een landcode');
  if checkISIN like '%KTU%'
   then dbms_output.put_line('Beschikt over een universiteit code');
    if checkISIN like ''
     then dbms_output.put_line('Beschikt over een nummerreeks');
   end if;
  end if;
 end if;
 */
 --select isin
 --into checkISIN
 --from dual
 --where regexp_like(checkISIN, '^[[:digit:]]+$');
 isin := regexp_like(isin, '[[:digit:]]');
 dbms_output.put_line(checkISIN);

  return isCorrect;

exception
 when e_lengteNummer
 then dbms_output.put_line('Foutmelding: Nummereeks is kleiner dan 9');

 when e_onbekendeLandCode
 then dbms_output.put_line('Foutmelding: Landcode is niet geldig of bestaat niet');

 when e_onbekendeUniCode
 then dbms_output.put_line('Foutmelding: Universiteit code is niet geldig of bestaat niet');

end checkForCorrectness;
/
show errors function checkForCorrectness
/*
begin
 dbms_output.put_line(checkForCorrectness('NL 4633 4809 KTU'));
end;

现在我很困惑,我什至不知道该怎么办了。我希望你们中的一些人可以帮助我。

长话短说。我得到了这个检查值(以及更多):

ASSERT_EQUALS(checkForCorrectness('NL 4633 4809 KTU'),1);
ASSERT_EQUALS(checkForCorrectness('NL 4954 2537 7808 MSM'),1);

输入是一个字符串,其中包含国家代码 (NL)、数字 (4633 4809) 和大学代码 (KTU)。如果结果为真或通过验证,则返回 1,否则返回 0。

希望我的问题不要太含糊。

如果有人可以向我解释我需要制作/采取什么样的功能和步骤,那就太棒了

提前致谢

【问题讨论】:

  • 所有国家代码都是两个字符吗?所有大学代码都是三个字符吗?国家代码和大学代码之间是否允许除空格和数字以外的任何字符?对它们的组装方式是否有任何限制(即NL 4 9 5 425 MSM 是否有效)?还是数字总是以 4 个一组出现?您是否尝试根据查找表验证国家和大学代码?或者只是检查它们分别是两个和三个字母代码?
  • 国家和大学代码可能超过 2 或 3 个字符。因为数字是必须的 4 对(直到不可能)。我不知道检查国家和大学代码的最佳方法是什么,但我想从他们自己的表格中检查这两个(如果可能的话)
  • 好的。那么,您想要执行的规则到底是什么? 1 个或多个字母后跟一个空格,后跟 1 个或更多组四个连续数字,后跟一个空格,后跟 1 个或多个字母?读到第一个空格总是可以解析出国家代码,读到最后一个空格可以解析出大学代码吗?
  • 就我的测试表而言,国家/地区代码的长度可能会有所不同,但始终位于前面。大学代码的长度也可能不同,但始终位于代码的末尾。在中间,数字可能会因长度而异,但它们需要尽可能地以 4 配对。 3 个值之间总是有一个空格。我需要将测试表中的 ISIN 字符串放入函数中。从那里我需要检查表格中是否存在国家和大学代码,最后我需要检查是否至少有 8 位数字。抱歉英语不好
  • “尽可能4配对”是什么意思?是否存在数字不成对出现 4 的情况?围绕它的规则是什么?国家代码是否总是可以通过读取到第一个空格来解析出来,而大学代码可以通过读取最后一个空格来解析出来吗?它们总是出现在开头和结尾,但它们总是跑到第一个空格并从最后一个空格开始吗?

标签: regex string oracle oracle11g numbers


【解决方案1】:

可能下面的 sql 块代码将有助于获得您想要的输出......

set serveroutput on
Declare
  vStr Varchar2(100);
  iB Number := 0;
Begin
  vStr := 'NL 4633 4809 KTU';

  select distinct 1
  into iB
  from country where name = Substr(vStr,1,2);

  if iB = 1 then
    dbms_output.put_line('country is legit');
  end if;

  select distinct 1
  into iB
  from university where name = Substr(vStr,length(vStr)-2,3);

  if iB = 1 then
    dbms_output.put_line('uni. is legit');
  end if; 

End;
/

【讨论】:

    【解决方案2】:

    好的,我不太清楚您在做什么,但是也许以下内容可能会有所帮助。从数据创建表

    create table mytable as select 'NL 4633 4809 KTU' txt from dual;
    

    您可以使用正则表达式将单词分成几列

    SELECT  REGEXP_SUBSTR (txt, '[^ ]+', 1, 1)    AS part_1
    ,       REGEXP_SUBSTR (txt, '[^ ]+', 1, 2)    AS part_2
    ,       REGEXP_SUBSTR (txt, '[^ ]+', 1, 3)    AS part_3
    ,       REGEXP_SUBSTR (txt, '[^ ]+', 1, 4)    AS part_4
    FROM    mytable;
    

    这将为您提供 4 列,并将您的单词分开。

    part1 part2 part3 part4
    NL 4633 4809 KTU
    

    或者您可以使用带有 connect by 语句的正则表达式来将您的单词转换为行。

    select REGEXP_SUBSTR (txt, '[^ ]+', 1, level) val from mytable connect by level <= regexp_count(txt,' ') + 1;
    

    这会给你四行

    NL
    4633
    4809
    KTU
    

    【讨论】:

    • 感谢您的解释。稍微调整一下,它就起作用了。再次感谢。我将您的遮阳篷标记为正确的。干杯
    猜你喜欢
    • 2019-02-06
    • 2015-06-01
    • 2015-10-28
    • 2011-11-28
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多