【问题标题】:Oracle: How to determine if a column is a "boolean"?Oracle:如何确定列是否为“布尔值”?
【发布时间】:2012-05-11 15:01:26
【问题描述】:

我创建这样的准布尔列:

CREATE TABLE foo
    bar NUMBER(1) DEFAULT 0 NOT NULL CHECK (hide IN (0, 1))

我目前正在抓取user_tab_columns,并希望能够确定给定列是否为布尔值。到目前为止,我得到了这个:

SELECT column_name,
       (SELECT COUNT(*)
        FROM   all_constraints
        WHERE  table_name = table_name
        AND    constraint_type = 'C'
        AND    REGEXP_LIKE(search_condition, '^ *' || column_name || ' +IN *\( *0, *1 *\) *$', 'i')) is_boolean
FROM   user_tab_columns;

但我收到以下错误:

ORA-00932: inconsistent datatypes: expected NUMBER got LONG
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 6 Column: 31

我了解到这是因为search_condition 数据类型是LONG,而REGEXP_LIKE() 需要一个字符类型,但我不知道如何解决这个问题。

我这样做的方式是否正确?如果是这样,我该如何解决我遇到的错误?如果没有,有什么更好的方法?

【问题讨论】:

  • 我很抱歉,Stack Overflow 在提交和编辑时给了我错误。这是一个真正的问题,我发誓:(
  • 它似乎不喜欢我的 CREATE TABLE 查询周围的括号 ( )... ????
  • 我个人更喜欢 CHAR(1) 约束为 NOT NULL CHECK(colname IN ('Y', 'N'))。 IMO 编号很容易以 CHAR 字段没有的方式被滥用。 YMMV。

标签: sql oracle boolean


【解决方案1】:

您可以使用 Oracle cmets:

COMMENT ON COLUMN foo.bar is 'Boolean';

【讨论】:

    【解决方案2】:

    是的,LONG 数据类型很难使用。解决此问题的一种方法是创建一个函数以将约束的搜索条件作为 varchar2 返回:

    create or replace
    function search_condition
    ( p_owner varchar2
    , p_constraint_name varchar2
    ) return varchar2
    is
      l_text long;
    begin
      select search_condition into l_text from all_constraints
      where owner = p_owner
      and constraint_name = p_constraint_name;
      return l_text;
    end;
    

    现在您可以在查询中使用它:

    select constraint_name, search_condition from
    (
    select constraint_name, search_condition (owner, constraint_name) search_condition
    from all_constraints
    where constraint_type = 'C'
    and owner = 'TONYEOR'
    )
    where  ... 
    

    【讨论】:

      【解决方案3】:

      这取决于您的应用程序,但查看列类型、比例和精度可能就足够了。我认为我从未见过 number(1) 在 Oracle 数据库中用于除布尔值之外的任何内容。

      【讨论】:

      • 我有这个案子;)(我完全同意这是一个可怕的选择)。但是您的答案目前似乎是有效的。例如,用于 .Net 的 Devart 连接器将所有数字 (1) 转换为布尔值
      • 不幸的是,这对于我的特定应用程序来说不是一个安全的假设,因为我们有几个 NUMBER(1) 列包含非布尔数据。
      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2010-09-27
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2013-01-31
      • 2019-09-08
      相关资源
      最近更新 更多