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包装器.
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。它看起来像一个带有true或false值的列。
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”。
| 归档时间: |
|
| 查看次数: |
5130 次 |
| 最近记录: |