【问题标题】:How to profile oracle database column values using SQL for type of value stored in column如何使用 SQL 为存储在列中的值类型分析 oracle 数据库列值
【发布时间】:2011-02-25 18:00:40
【问题描述】:

我有一个要求,我必须分析/检查 oracle 数据库表中的特定列是否仅包含字符(城市等列中不允许使用数字)。同样,我必须检查一列是否可以包含字母数字值但不能包含特殊字符。如何使用 oracle sql 来完成。

【问题讨论】:

    标签: sql oracle types


    【解决方案1】:

    如果您使用的是 10g+ 版本,您可以尝试使用 regexp_instr 函数并搜索所需 posix 字符类的出现。

    例子:

    create table test1(onlyletters varchar2(100))
    /
    insert into test1
    values('a')
    /
    insert into test1
    values('b')
    /
    insert into test1
    values('a1')
    /
    insert into test1
    values('22')
    /
    
    select *
    from  test1
    where REGEXP_INSTR(onlyletters, '[[:digit:]]') = 0
    

    这应该只返回列“onlyletters”没有数字的行,在这种情况下是那些值为“a”和“b”的行。

    如果要查找包含数字的那些,请搜索 REGEXP_INSTR(...) > 0。

    我不确定您所说的特殊字符是什么意思,但是您可以通过这种方式使用不同的 posix 字符类,我用它来检测带有 "REGEXP_INSTR(onlyletters, '[[:cntrl:]] 的控制字符')"。

    这里有更多关于字符类的信息:http://www.regular-expressions.info/posixbrackets.html

    【讨论】:

    【解决方案2】:

    这是一个使用 TRANSLATE 的示例。您可能需要对您希望允许和不允许的字符进行一些调整,但它会给您一个想法:

    SQL> create table cities
      2  ( name varchar2(30)
      3  , constraint city_name_alphanumeric
      4    check (translate(upper(name),'1ABCDEFGHIJKLMNOPQRSTUVWXYZ','1') is null)
      5  )
      6  /
    
    Table created.
    
    SQL> insert into cities values ('Utrecht')
      2  /
    
    1 row created.
    
    SQL> insert into cities values ('Utr3cht')
      2  /
    insert into cities values ('Utr3cht')
    *
    ERROR at line 1:
    ORA-02290: check constraint (RWIJK.CITY_NAME_ALPHANUMERIC) violated
    
    
    SQL> insert into cities values ('UtrΘcht')
      2  /
    insert into cities values ('UtrΘcht')
    *
    ERROR at line 1:
    ORA-02290: check constraint (RWIJK.CITY_NAME_ALPHANUMERIC) violated
    
    
    SQL> insert into cities values ('|Utrecht')
      2  /
    insert into cities values ('|Utrecht')
    *
    ERROR at line 1:
    ORA-02290: check constraint (RWIJK.CITY_NAME_ALPHANUMERIC) violated
    

    这是一个使用正则表达式的例子:

    SQL> delete cities
      2  /
    
    1 row deleted.
    
    SQL> alter table cities
      2    drop constraint city_name_alphanumeric
      3  /
    
    Table altered.
    
    SQL> alter table cities
      2    add constraint city_name_alphanumeric
      3    check (regexp_like(name,'^[[:alpha:]]+$'))
      4  /
    
    Table altered.
    
    SQL> insert into cities values ('Utrecht')
      2  /
    
    1 row created.
    
    SQL> insert into cities values ('Utr3cht')
      2  /
    insert into cities values ('Utr3cht')
    *
    ERROR at line 1:
    ORA-02290: check constraint (RWIJK.CITY_NAME_ALPHANUMERIC) violated
    
    
    SQL> insert into cities values ('UtrΘcht')
      2  /
    insert into cities values ('UtrΘcht')
    *
    ERROR at line 1:
    ORA-02290: check constraint (RWIJK.CITY_NAME_ALPHANUMERIC) violated
    
    
    SQL> insert into cities values ('|Utrecht')
      2  /
    insert into cities values ('|Utrecht')
    *
    ERROR at line 1:
    ORA-02290: check constraint (RWIJK.CITY_NAME_ALPHANUMERIC) violated
    

    问候,
    抢。

    【讨论】:

    • 感谢您的帮助,我的要求是分析/分析现有数据,我可以使用选择读取数据,我无法创建约束。
    • 我的错。不过,您可以在 where 子句的谓词中使用检查条件。
    猜你喜欢
    • 2020-09-29
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多