如何使用SELECT语句布尔类型(How to use BOOLEAN type in SELECT

2019-07-19 03:07发布

我有一个在参数Boolean一个PL / SQL函数:

function get_something(name in varchar2, ignore_notfound in boolean);

此功能的第三方工具的一部分,我无法改变这一点。

我想用这样一个SELECT语句中这样的功能:

 select get_something('NAME', TRUE) from dual;

这是不行的,我得到这个异常:

ORA-00904: “TRUE”:无效的标识符

据我了解,关键字TRUE不被认可。

我怎样才能使这项工作?

Answer 1:

你可以建立一个像这样的包装函数:

function get_something(name in varchar2,
                   ignore_notfound in varchar2) return varchar2
is
begin
    return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;

然后调用:

select get_something('NAME', 'TRUE') from dual;

这是给你什么ignore_notfound的有效值是在你的版本中,我假设“TRUE”意味着真别的意思FALSE。



Answer 2:

你绝对可以从一个SELECT查询获得布尔值,你就不能使用布尔数据类型。

你可以表示与1/0布尔。

CASE WHEN (10 > 0) THEN 1  ELSE 0 END (It can be used in SELECT QUERY)

SELECT CASE WHEN (10 > 0) THEN 1  ELSE 0 END AS MY_BOOLEAN_COLUMN
  FROM DUAL

返回,1(在休眠/ MyBatis的/等1为真)。 否则,你可以从一个SELECT获取打印布尔值。

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
 FROM DUAL

这将返回字符串'true'



Answer 3:

从文档 :

你可以不插入值TRUEFALSE到数据库列。 你不能选择或取列值转换为BOOLEAN变量。 从调用函数SQL查询不能采取任何BOOLEAN参数。 也不能内置SQL功能,如TO_CHAR ; 代表BOOLEAN在输出值,则必须使用IF-THENCASE构建翻译BOOLEAN值插入一些其它类型的,如01'Y''N''true''false' ,等。

你需要做一个包装函数,它的SQL数据类型,并用它来代替。



Answer 4:

布尔数据类型是一个PL / SQL数据类型。 Oracle不提供等效的SQL数据类型(......),你可以创建其中SQL类型布尔类型映射的包装功能。

检查: http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284



Answer 5:

select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;


Answer 6:

在你的数据库编译这一点,并开始在querys使用布尔语句。

注意:该功能GET是一个VARCHAR2 PARAM,所以一定要在你的语句来包装任何“线”。 这将返回FALSE 1表示是; 0;

select bool('''abc''<''bfg''') from dual;

CREATE OR REPLACE function bool(p_str in varchar2) return varchar2 
 is
 begin

 execute immediate ' begin if '||P_str||' then
          :v_res :=  1;
       else
          :v_res :=  0;
       end if; end;' using out v_res;

       return v_res;

 exception 
  when others then 
    return '"'||p_str||'" is not a boolean expr.';
 end;
/


Answer 7:

回答这个问题,简单的说就是:不要使用布尔与Oracle-- PL / SQL是愚蠢的,它不工作。 使用另一种数据类型来运行您的程序。

一个注SSRS报表开发人员使用Oracle数据源:您可以使用布尔参数,但要小心你如何实现。 甲骨文的PL / SQL不布尔发挥很好,但如果数据驻留在你的数据集,你可以使用Tablix中的布尔值过滤器。 这真的绊倒了我,因为我已经使用布尔参数与Oracle数据源。 但在这种情况下,我对过滤Tablix数据,而不是SQL查询。

如果数据是不是在你的SSRS数据集字段,你可以使用整数参数重写SQL是这样的:

__

<ReportParameter Name="paramPickupOrders">
  <DataType>Integer</DataType>
  <DefaultValue>
    <Values>
      <Value>0</Value>
    </Values>
  </DefaultValue>
  <Prompt>Pickup orders?</Prompt>
  <ValidValues>
    <ParameterValues>
      <ParameterValue>
        <Value>0</Value>
        <Label>NO</Label>
      </ParameterValue>
      <ParameterValue>
        <Value>1</Value>
        <Label>YES</Label>
      </ParameterValue>
    </ParameterValues>
  </ValidValues>
</ReportParameter>

...

<Query>
<DataSourceName>Gmenu</DataSourceName>
<QueryParameters>
  <QueryParameter Name=":paramPickupOrders">
    <Value>=Parameters!paramPickupOrders.Value</Value>
  </QueryParameter>
<CommandText>
    where 
        (:paramPickupOrders = 0 AND ordh.PICKUP_FLAG = 'N'
        OR :paramPickupOrders = 1 AND ordh.PICKUP_FLAG = 'Y' )

如果数据是在你的SSRS数据集字段,你可以使用带有一个布尔参数表矩阵过滤器:

__

</ReportParameter>
<ReportParameter Name="paramFilterOrdersWithNoLoad">
  <DataType>Boolean</DataType>
  <DefaultValue>
    <Values>
      <Value>false</Value>
    </Values>
  </DefaultValue>
  <Prompt>Only orders with no load?</Prompt>
</ReportParameter>

...

<Tablix Name="tablix_dsMyData">
<Filters>
  <Filter>
    <FilterExpression>
        =(Parameters!paramFilterOrdersWithNoLoad.Value=false) 
        or (Parameters!paramFilterOrdersWithNoLoad.Value=true and Fields!LOADNUMBER.Value=0)
    </FilterExpression>
    <Operator>Equal</Operator>
    <FilterValues>
      <FilterValue DataType="Boolean">=true</FilterValue>
    </FilterValues>
  </Filter>
</Filters>


Answer 8:

随着甲骨文12,可以使用WITH子句来声明你的辅助功能。 我假设你get_something函数返回varchar2

with
  function get_something_(name varchar2, ignore_notfound number)
  return varchar2 
  is
  begin
    -- Actual function call here
    return get_something(name, not ignore_notfound = 0);
  end get_something_;

  -- Call auxiliary function instead of actual function
select get_something_('NAME', 1) from dual;

当然,你可能还存储在您的辅助功能某处架构如图这个答案 ,但是通过使用WITH ,你没有任何外部的依赖只是为了运行此查询。 我在这里的博客上讲述这个技术更详细 。



Answer 9:

如何有关使用其评估为TRUE(或FALSE)的表达式?

select get_something('NAME', 1 = 1) from dual


Answer 10:

PL / SQL抱怨并TRUE是不是一个有效标识符,或可变的。 设置一个局部变量,将其设置为TRUE,并把它传递到get_something功能。



文章来源: How to use BOOLEAN type in SELECT statement