我正在尝试分析一个已故的开发人员编写的现有Oracle查询。我对Oracle不熟悉,并且对DECODE应用程序(其中Microfocus COBOL是设置为年份的变量)中的:BV-POS_YEAR函数的使用感到有些困惑:

SELECT ...., DECODE(DELV_YEAR, NULL, :BV-POS_YEAR, DELV_YEAR), ....

我试图了解与以下内容有何不同:
SELECT ...., NVL(DELV_YEAR, :BV-POS_YEAR), ....

我是否误解了DECODENVL函数?开发人员知道NVL函数,因为它在同一select语句中的其他地方使用。

最佳答案

NVL用指定的值替换NULL
DECODE用所需的值替换任何指定的值,并且可以链接。您的用法是等效的,但DECODE的用法要广泛得多。例如,您可以编写此代码

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

等效于此伪代码
if (supplier_id == 10000)
{
    SELECT 'IBM'
} else if (supplier_id == 10001)
{
    SELECT 'Microsoft'
} else if (supplier_id == 10002)
{
    SELECT 'Hewlet Packard'
} else
{
    SELECT 'Gateway'
}

编辑:用户对NVL和DECODE替换NULL的性能进行了评估,似乎几乎相等。

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

关于sql - Oracle DECODE与NVL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26847126/

10-13 08:54