General Functions & Conditional Expressions

本文详细介绍了SQL中的通用函数如NVL、NVL2、NULLIF和COALESCE的功能及使用方法,并深入探讨了条件表达函数CASE和DECODE的应用场景与实例。通过丰富的示例帮助读者更好地理解和掌握这些函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、通用函数

函数说明
NVL语法:NVL(expr1,expr2)
说明:如果expr1为NULL,则该函数显示expr2的值;
例子:
SELECT SALARY, NVL(TO_CHAR(COMMISSION_PCT), 0) FROM EMPLOYEES;
NVL2语法:NVL2(expr1,expr2,expr3)
说明:如果expr1的值为NULL,则该函数显示expr3的值;不为NULL,显示expr2的值;
例子:
SELECT LAST_NAME,
       SALARY,
       COMMISSION_PCT,
       NVL2(COMMISSION_PCT, 'SAL+COMM', 'SAL') INCOME
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID IN (50, 80);
NULLIF语法:NULLIF(expr1,expr2)
说明:如果expr1=expr2,返回NULL;若不等,则返回第一个表达式的值;
例子:
SELECT FIRST_NAME,
       LENGTH(FIRST_NAME) "expr1",
       LAST_NAME,
       LENGTH(LAST_NAME) "expr2",
       NULLIF(LENGTH(FIRST_NAME), LENGTH(LAST_NAME)) RESULT
  FROM EMPLOYEES;
COLESCE语法:COALSECE(expr1,expr2,expr3)
说明:如果全为NULL,则函数值为NULL;若有一项不为NULL,则显示那一项exprN;若三项都不为空,则显示最前面的一项expr;
例子:
  • SELECT COALESCE(NULL, 1, 2, 3, 4) FROM DUAL;
  • SELECT COALESCE(NULL, NULL, 2, 3, 4) FROM DUAL;

二、条件表达函数

函数说明
CASE语法:
CASE expr 
  WHEN comparison_expr1THEN return_expr1
  [WHENcomparison_expr2 THENreturn_expr2
  WHENcomparison_exprn THENreturn_exprn
  ELSE else_expr]
END
说明:
  • 对已知的数据库中数据,按照自己的逻辑,进行自定义分组和数据分析
  • 用此条件控制语句,实现自定义条件分组
  • 条件控制语句中嵌套函数达到理想的计算效果
例句:
SELECT last_name,salary, 
       (CASE WHEN salary<5000 THEN 'Low' 
             WHEN salary<10000 THEN 'Medium' 
             WHEN salary<20000 THEN 'Good' 
             ELSE 'Excellent' 
       END) qualified_salary 
FROM employees;
DECODE语法:
DECODE(col|expression, search1, result1
        [, search2, result2,...,]
        [, default])
说明:decode 具有和 IF-THEN-ELSE 一样的功能。
例句:
SELECT PRODUCT_ID,
       DECODE(WAREHOUSE_ID, 
              1, 'Southlake',
              2, 'San Francisco',
              3, 'New Jersey',
              4, 'Seattle',
              'Non-domestic') "Location of inventory"    
  FROM INVENTORIES    
 WHERE PRODUCT_ID < 1775;

三、嵌套函数

例句:
SELECT LAST_NAME,
      SALARY,
      DECODE(TRUNC(SALARY / 2000, 0),
              0, 0.00,
              1, 0.09,
              2, 0.20,
              3, 0.30,
              4, 0.40,
              5, 0.42,
              6, 0.44,
              0.45) TAX_RATE
  FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80;
根据您提供的错误信息 &quot;Shader error in &#39;Custom/MyShader&#39;: if statement conditional expressions must evaluate to a scalar at line 124 (on d3d11)&quot;,这表明在第124行的 `if` 语句中,条件表达式的计算结果不是一个标量值(即单个数值),而是向量或其他非标量类型的数据。 具体到您的代码片段: ```glsl #if USE_ALPHA_TEST if (s.albedo.ALPHA_TEST_CHANNEL &lt; albedoScaleAndCutoff.w) discard; #endif ``` 这里的问题在于 `ALPHA_TEST_CHANNEL` 被定义为一个选项 `[a, r]`,这意味着它可能是一个向量中的某个分量(例如 `albedo.a` 或 `albedo.r`)。然而,在 `if` 语句中直接使用 `s.albedo.ALPHA_TEST_CHANNEL` 可能会导致编译器无法确定这是一个标量值。 ### 解决方案 1. **确保 `ALPHA_TEST_CHANNEL` 是一个标量**: 您可以显式地指定 `ALPHA_TEST_CHANNEL` 是 `a` 还是 `r`,并在 `if` 语句中使用相应的分量。 ```glsl #if USE_ALPHA_TEST #if defined(ALPHA_TEST_CHANNEL_a) if (s.albedo.a &lt; albedoScaleAndCutoff.w) discard; #elif defined(ALPHA_TEST_CHANNEL_r) if (s.albedo.r &lt; albedoScaleAndCutoff.w) discard; #endif #endif ``` 2. **使用宏定义来选择正确的分量**: 如果您希望保持灵活性,可以在预处理阶段选择正确的分量。 ```glsl #if USE_ALPHA_TEST #ifdef ALPHA_TEST_CHANNEL_a #define ALPHA_TEST_VALUE s.albedo.a #else #define ALPHA_TEST_VALUE s.albedo.r #endif if (ALPHA_TEST_VALUE &lt; albedoScaleAndCutoff.w) discard; #endif ``` 通过上述方法,您可以确保 `if` 语句的条件表达式始终是一个标量值,从而避免编译错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值