如何编写仅在没有比较运算符的情况下计算结果为true的where子句中使用的函数?

use*_*850 7 sql oracle plsql where-clause conditional-statements

我的问题是: 在Oracle中,regexp_like在where子句中单独工作,而不必与1或0或字符串进行比较.只能在case语句或where子句中评估某些内容时调用该函数.由于无法描述(尝试在数据字典中搜索它),我想知道如何编写一个以相同方式工作的函数.

例如:

function is_prod
returns boolean
is 
  l_var boolean := false;
begin
  if sys_context('userenv','db_unique_name') = '"PROD_SERVER"' then
    l_var := true;
  end if;
return l_var;
end;
Run Code Online (Sandbox Code Playgroud)

该函数编译,但不能在如下的SQL语句中使用:

select *
from table t
where is_prod
Run Code Online (Sandbox Code Playgroud)

因为我收到以下错误:ORA-00920:无效的关系运算符.

将它与数字或真实比较也不起作用.

我在哪里可以找到regexp_like的代码库,或者我需要做些什么来使其像regexp_like一样工作?

注意:我已经浏览了几个小时,发现Oracle的regexp函数实际上是java调用,但这意味着它们仍然需要一个pl/sql包装器.

A.B*_*ade 9

基本上,oracle 只有 PLSQL 的布尔数据类型.所以,只要你留在plsql中就可以使用它们,但不能在SQL中使用它们.

来自文档:

因为SQL没有与BOOLEAN等效的数据类型,所以不能:

  • 将BOOLEAN值分配给数据库表列

  • 选择或获取数据库表列的值为BOOLEAN变量

  • 在SQL语句,SQL函数或从SQL语句调用的PL/SQL函数中使用BOOLEAN值

如果您想查找有关内置函数的元数据,那么这篇文章可能有所帮助.


Mal*_*chi -1

SQL 不是这样工作的。where 语句总是寻找某个东西所在的函数/列。即使该函数有效,您仍然必须告诉 where 语句您想要哪个值 True 或 False

我没有使用过 Oracle SQL,但是看看你那里的内容,我认为如果你这样写

  select *
  from table t
  where is_prod = True
Run Code Online (Sandbox Code Playgroud)

如果您将函数中的变量类型更改为 Varchar(5) 或类似的类型,它将起作用。

您实际上是要求该函数查看多条记录,因此当您像您一样拥有它时,它的作用就像一个 Select 语句,而不是像一个 where 语句。它会给出函数的值,但不会过滤 where。它看起来像一个带有truefalse值的列。

Where当您在如下语句中使用该函数时:

SELECT *
FROM table t
WHERE is_Prod
Run Code Online (Sandbox Code Playgroud)

这就像在说:

SELECT *
FROM table t
WHERE Column1
Run Code Online (Sandbox Code Playgroud)

你必须在WHERE声明中澄清

SELECT *
FROM table t
WHERE Column1 = 'blue' or is_Prod = 'false'
Run Code Online (Sandbox Code Playgroud)

在 C# 中,您可以使用 String 作为布尔值,如果它为 null,则返回 false

在 SQL Server 中它是这样的

Column2 IS NULL
Run Code Online (Sandbox Code Playgroud)

你还需要一个操作员

* 分隔器 *

因为我不使用 Oracle,所以无法对此进行测试。

http://docs.oracle.com/cd/B14117_01/server.101/b10759/conditions018.htm

REGEXP_LIKE 是一个 like 语句。所以它使用比较运算符。

您可能可以在类似的语句中编写正则表达式,尽管我确信这既耗时又单调,因此他们创建了一个函数来为您完成此操作。

换句话说,您仍然必须在您创建的函数上使用“=whatever”。

  • 不,Oracle SQL 没有布尔类型(尽管 PL/SQL 有),因此您不能使用返回布尔值的函数。你当然可以用 0/1、T/F 而不是真正的布尔值来伪造它,但我认为这是 OP 试图避免的。 (2认同)