服务器端的 Firebird 计算(计算)字段
Firebird computed (calculated) field on server side
SQL 的新手和一般的开发,我有一个 table(国家/地区),其中包含字段(INDEX、NAME、POPULATION、AREA)
通常我会添加一个客户端 (Delphi) 计算字段 (DENSITY) 和 OnCalcField :
COUNTRIES.DENSITY=COUNTRIES.POPULATION / COUNTRIES.AREA
尝试更改为 Firebird 计算字段以在服务器端完成所有计算,我创建了一个名为密度的字段并在 IBEXPERT“计算源”列中:
ADD DENSITY COMPUTED BY ((((COUNTRIES.POPULATION/COUNTRIES.AREA))))
一切正常,但当 Record.AREA = 0 时出现除以零错误。
我的问题是如何避免这种情况,例如使用 IF THEN 条件以避免在分隔符为 0 时计算字段或在这种情况下使结果仅为 =0。
我的环境:
Delphi RIO、Firebird 3.0、IBExpert
您可以使用 IIF()。当第一个参数为 TRUE 时,IIF returns 第二个参数的值,否则为第三个参数的值。
ADD DENSITY COMPUTED BY (IIF(COUNTRIES.AREA = 0, 0, COUNTRIES.POPULATION / COUNTRIES.AREA))
(注意我还删除了一些额外的括号)
处理除以零时,我建议返回 NULL(而不是零),简单使用 NULLIF(当两个输入参数相等时 returns null 的内部函数):
ADD DENSITY COMPUTED BY (COUNTRIES.POPULATION / nullif(COUNTRIES.AREA, 0))
即:当COUNTRIES.AREA = 0时,整个除法运算结果也为null。
SQL 的新手和一般的开发,我有一个 table(国家/地区),其中包含字段(INDEX、NAME、POPULATION、AREA) 通常我会添加一个客户端 (Delphi) 计算字段 (DENSITY) 和 OnCalcField :
COUNTRIES.DENSITY=COUNTRIES.POPULATION / COUNTRIES.AREA
尝试更改为 Firebird 计算字段以在服务器端完成所有计算,我创建了一个名为密度的字段并在 IBEXPERT“计算源”列中:
ADD DENSITY COMPUTED BY ((((COUNTRIES.POPULATION/COUNTRIES.AREA))))
一切正常,但当 Record.AREA = 0 时出现除以零错误。
我的问题是如何避免这种情况,例如使用 IF THEN 条件以避免在分隔符为 0 时计算字段或在这种情况下使结果仅为 =0。
我的环境: Delphi RIO、Firebird 3.0、IBExpert
您可以使用 IIF()。当第一个参数为 TRUE 时,IIF returns 第二个参数的值,否则为第三个参数的值。
ADD DENSITY COMPUTED BY (IIF(COUNTRIES.AREA = 0, 0, COUNTRIES.POPULATION / COUNTRIES.AREA))
(注意我还删除了一些额外的括号)
处理除以零时,我建议返回 NULL(而不是零),简单使用 NULLIF(当两个输入参数相等时 returns null 的内部函数):
ADD DENSITY COMPUTED BY (COUNTRIES.POPULATION / nullif(COUNTRIES.AREA, 0))
即:当COUNTRIES.AREA = 0时,整个除法运算结果也为null。