Oracle DECODE与NVL

Pet*_*ete 4 sql oracle

我正在尝试分析由已离职的开发人员编写的现有Oracle查询.我不熟悉Oracle,我对DECODEMicrofocus COBOLapp中使用此函数感到有点困惑(其中:BV-POS_YEAR一个变量设置为一年):

SELECT ...., DECODE(DELV_YEAR, NULL, :BV-POS_YEAR, DELV_YEAR), ....
Run Code Online (Sandbox Code Playgroud)

我试图了解它与以下内容有何不同:

SELECT ...., NVL(DELV_YEAR, :BV-POS_YEAR), ....
Run Code Online (Sandbox Code Playgroud)

我误解了关于DECODENVL功能的一些事情吗?开发人员知道NVL函数,因为它在同一个select语句的其他地方使用.

Mic*_*hal 9

NVL替换NULL指定的值.

DECODE用期望的值替换任何指定的值,并且可以链接.您的用法相同,但DECODE使用范围更广.例如,您可以编写此代码

SELECT supplier_name,
DECODE(supplier_id, 10000, 'IBM',
                    10001, 'Microsoft',
                    10002, 'Hewlett Packard',
                    'Gateway') result
FROM suppliers;
Run Code Online (Sandbox Code Playgroud)

这相当于这个伪代码

if (supplier_id == 10000)
{
    SELECT 'IBM'
} else if (supplier_id == 10001)
{
    SELECT 'Microsoft'
} else if (supplier_id == 10002)
{
    SELECT 'Hewlet Packard'
} else
{
    SELECT 'Gateway'
}
Run Code Online (Sandbox Code Playgroud)

编辑:用户测量用于NULL替换的NVL和DECODE的性能,它似乎几乎相等.

我个人建议在需要进行NULL替换时使用NVL,因为它更具表现力.