Oracle中的LEFT函数

时间:2012-07-03 10:43:55

标签: sql oracle

我正在查看Oracle(10g)存储过程并遇到以下LEFT / RIGHT函数。

TO_DATE(LEFT('01-Jun-1201',9))

在Toad编辑器中,我无法运行此功能,必须将其更改为LPAD

TO_DATE(LPAD('01-Jun-1201',9))

使用LEFT / RIGHT函数存储过程正常运行,但如果我使用LPAD / RPAD,则运行速度会更快。

Oracle中是否有LEFT函数,如果没有,那么为什么存储过程运行正常?

SELECT
    SUM(DECODE(SIGN(TO_DATE(LEFT('01-Jun-12', 9)) - TO_DATE(logdate)),
               -1, totaltime, 0, totaltime, 0)) AS totaltime
  FROM AREA2.v_area
  WHERE logdate >= TO_DATE(RIGHT('01-Jun-12', 9))
    AND logdate <= TO_DATE('30-Jun-12')

4 个答案:

答案 0 :(得分:4)

Oracle中没有记录的LEFT()函数。 Find the full set here

你所拥有的可能是用户定义的功能。您可以通过查询数据字典轻松检查:

select * from all_objects
where object_name = 'LEFT'

但是存在为什么存储过程有效而查询无效的问题。一种可能的解决方案是存储过程由另一个模式拥有,该模式也拥有LEFT()函数。他们已授予程序权利,但不授予其依赖权。这是有效的,因为默认情况下存储过程以DEFINER权限运行,因此您就像运行它的所有者一样运行存储过程。

如果是这样,那么我上面列出的数据字典查询将无法帮助您:它只返回您拥有权限的对象的行。在这种情况下,您将需要以存储过程的所有者身份运行查询,或者以具有查询DBA_OBJECTS的权限的用户身份进行连接。

答案 1 :(得分:4)

我发现Oracle中不支持LEFT和RIGHT功能。它们用于SQL Server,MySQL和其他一些SQL版本。在Oracle中,您需要使用SUBSTR功能。以下是一些简单的例子:

LEFT ('Data', 2) = 'Da'

->   SUBSTR('Data',1,2) = 'Da'

RIGHT ('Data', 2) = 'ta'

->   SUBSTR('Data',-2,2) = 'ta'

请注意,负数从最后开始计算。

答案 2 :(得分:0)

LEFT不是Oracle中的一项功能。这可能来自熟悉SQL Server的人:

  

返回具有指定字符数的字符串的左侧部分。

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
LEFT ( character_expression , integer_expression )  

答案 3 :(得分:0)

Oracle中的左函数等效于Substr(char_expr,-n)。例如:

substr(txtCol, -3) = left(txtCol, 3)

希望这会有所帮助。