我正在尝试分析由已离职的开发人员编写的现有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), ....
我是否误解了DECODE
或NVL
函数的某些内容?开发人员知道NVL函数,因为它在同一个select语句中的其他地方使用。
答案 0 :(得分:8)
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'
}
编辑:用户测量了NULL替换的NVL和DECODE的性能,它似乎几乎相等。
我个人建议在需要进行NULL替换时使用NVL,因为它更具表现力。
答案 1 :(得分:0)
让我们看一些 Oracle NVL 函数示例,探索如何在 Oracle/PLSQL 中使用 NVL 函数。
例如:
SELECT NVL(supplier_city, 'n/a')
FROM suppliers;
如果 'n/a'
字段包含空值,则上述 SQL 语句将返回 supplier_city
。否则,它将返回 supplier_city
值。
另一个在 Oracle/PLSQL 中使用 NVL 函数的例子是:
SELECT supplier_id,
NVL(supplier_desc, supplier_name)
FROM suppliers;
如果 supplier_name
包含空值,此 SQL 语句将返回 supplier_desc
字段。否则,它将返回 supplier_desc
。