sql中nullif函数什么意思

举例来说,coalesce(a.num,0),当a表的num在full

SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数

coalesce函数 coalesce函数判空不生效coalesce函数 coalesce函数判空不生效


coalesce函数 coalesce函数判空不生效


请看下面的 “Products” 表:

如 “UnitsOnOrder” 是可选的,而且可以包含 NULL 值。

我们使用下面的 SELECT 语句:

在上面的实例中,如果有 “UnitsOnOrder” 值是 NULL,那么结果是 NULL。

微软的 ISNULL() 函数用于规定如何处理 NULL 值。

NVL()、IFNULL() 和 COALESCE() 函数也可以达到相同的结果。

在这里,我们希望 NULL 值为 0。如果 “UnitsOnOrder” 是 NULL,则不会影响计算,因为如果值是 NULL 则 ISNULL() 返回 0:

比较 expr1和 expr2 的值,若二者相等,则返回 NULL,否则返回 expr1的值其中 expr1不能为 NULL。

1、NULL指的是空值,或者非法值NVL expr1, expr2->expr1为NULL,返回expr2不为NULL,返回expr1注意两者的类型要一致

2、NVL2 expr1, expr2, expr3->expr1不为NULL,返回expr2为NULL,返回expr3,expr2和expr3类型不同的话,expr3会转换为expr2的类型

3、NULLIgroup by by deptno jobF expr1, expr2 ->相等返回NULL,不等返回ex。

sql join 默认值

但数据库字符集修改后可能会面临很的后果 除非是数据库 普通用户不必对这方面进行深究

COALESCE(a.id,0),COALESCE(a.aa,0)

select coalesce(a.id,0),coalesce(a.aa,'0'),b.bb from a right join b on a.id=b.id;

coalesce函数注意里面各个参数数据类型一致即可

sqlserver:

设id为int类型,aa为字符型

select isnull(a.id,0),isnull(a.aa,'0'),b.bb from a right join b on a.id=b.id

select9、Oracle对象名不能超过30个字符

case when a.id is null then b.id else a.id end id,

case when a.aa is null then 0 else a.aa end aa,

b.bb

from a right join b on a.id=b.id

MySQL白菜教程(Ll 3)

,coalesce(a.id,

语法:

语法:

语法:

语法:

语法:

其中:

column_name为要舍入的字段

decimal规定要返回的小数位数

ROUND()函数始终返回一个值。当decimals为正数时,column_name四舍五入为decimal所指定的小数位数。为decimals为负数时,column_name则按decimals所指定的在小数点的左边四舍五入

特别的,如果length是负值且大于小数点前的数字个数,ROUND()函数将返回0

实例如下:

ROUND(CASE函数对表达式expression进行测试 如果expression等于value 则返回returnvalue 如果expression等于value 则返回returnvalue expression等于value 则返回returnvalue ……以此类推 如果不符合所有的WHEN条件 则返回默认值defaultreturnvalue X ):返回参数 X 四舍五入后的一个整数

ROUND(X, D): 返回参数 X 四舍五入且保留 D 位小数后的一个数字。如果 D 为 0,结果将没有小数点或小数部分

ISNULL()

ISNULL() 函数用于判断字段是否为NULL,只有一个参数 column_name 为列名,根据 column_name 列中的字段是否为NULL值返回0或1

语法:

其中:

如果 column_name 列中的某个字段是NULL则返回1,不是则返回0

IFNULL()

IFNULL() 函数也是用于判断字段是否为NULL,但是与 ISNULL() 不同的是它接收两个参数,个参数 column_name 为列名,第二个参数value相当于备用值

语法:

其中:

如果 column_name 列中的某个字段是NULL则返回value值,不是则返回对应内容

实例如下:

COUNT() 函数用于计数,可利用其确定表中行数的数目或者符合特定条件的行的数目。当 COUNT() 中的参数不同时,其的用途也是有明显的不同的,主要可分为以下三种情况: COUNT(column_name) 、 COUNT() 、 COUNT(DISTINCT column_name)

COUNT(column_name)

COUNT(column_name) 函数会对指定列具有的行数进行计数,但是会除去值为NULL的行。该函数只要用于查看和列数据的数量情况,便于统计数据的缺失值

设出现某一列的数据全为NULL值得情况

使用 COUNT(column_name) 函数对该列进行计数,会返回0

语法:

COUNT()

COUNT() 函数会对表中行的数目进行计数,包括值为NULL所在行和重复项所在行

该函数主要用于查看表中的记录数

语法:

注意: count(column_name) 和 count() 的区别

count(column_name) 中,如果 column_name 字段中值为NULL,则计数不会增加,而如果字段值为空字符串 "" ,则字段值会加1

count() 中,除非整个记录全为NULL,则计数不会增加,如果在某一个记录不为NULL,或者为空字符串"",计数值都会加1.正常来说,表都会有主键,而主键不为空,所以 COUNT() 在有主键的表中等同于 COUNT(PRIMARY_KEY) ,即查询有多少条记录

COUNT(DISTINCT column_name)

COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目

语法:

实例如下:

HiveSQL核心技能之表连接

目标:

1、掌握HQL中的各种连接及其组合使用;

2、掌握数据分析中业务指标思路转换的技巧;

3、区分好full join 和 union all 的使用场景;

4、在多表连接时,注意各种细节和业务逻辑;

需注意:

1、表连接时,必须进行重命名;

2、on后面使用的连接条件必须起到 键值 的作用(有时会有多个字段组合);

3、inner可省略不写,效果是一样的

4、表连接时不能使用 a join b join c这种方式,不然会极度浪费电脑的资源和延长查询时间,要在子查询的表里先做好筛选之后在连接;

1)找出在2019年购买后又退款的用户(记得要去重)

注意:一定要先去重,再做表连接,养成良好的习惯(虽然可以先连接再去重,但是那么做会使执行效率很低)

2)在20WHERE a department_id = b department_id17年和2018年都购买的用户

3)在2017年、2018年、2019年都有交易的用户

进行左连接之后,以左表为全集,返回能够匹配上的右边表的匹配结果,没有匹配上的则显示NULL。

拓展:

right join:以右表为全集,返回能够匹配上的左边表的匹配结果,没有匹配上的则显示NULL,可以由left join改写出同样的结果。

4)在2019年购买,但是没有退款的用户

5)在2019年由购买的用户的学历分布

6)在2017年和2018年都购买,但是没有在2019年购买的用户

查询两个表的所有用户时使用full join是一个比较好的方法(需要用到coalesce函数分组函数与空值:

注:coalesce函数,coalesce(expression1,expression2,...,expression n),依次参考各参数表达式,遇到非null值即停止并返回该值,如果所有的表达式都是空值,最终将返回一个空值。

注:表合并时字段名称必须一致,字段顺序必须一致,而且不用填写连接条件

7)2017-2019年由交易的所有用户数

union all 和 union 的区别:

union all 不会去重,不会排序,效率较快;union 会去重且排序,效率较慢。

如果表很大时,先去重,再进行 union all ,不能直接对表进行 union all,不然效率很慢。

8)2019年每个用户的支付和退款金额汇总

也可以使用 full join 的方式:

9)2019年每个支付用户的支付金额和退款金额

10)首次激活时间在2017年,但是一直没有支付的用户年龄段分布

步骤总结:

1、先筛选出年份为2017注册的用户;

2、没有支付的人;

3、年龄段分布

注意:由于age也是在user_的表格里,第三步用的字段需要在步进行预处理,所以在限制时间的时候需要同时对年龄段进行预处理,这样在第三步的时候才会由年龄段这个字段;需要注意对 case when 的字段进行重命名才能进行后续的作

11)2018、2019年交易的用户,其激活时间段分布

步骤总结:

2. 取出所有用户的激活时间

3. 统计时间分布

SQL语句解释

单行作符operator 多行作符operator

SELECT

from

m/这里就是查询啊

表名是

把表从新命名为

m/

where

COALESCE(last_replay_time,send_time)

=(select

max(COALESCE(last_replay_time,send_time))

from

nwhere

m.board_id

=n.board_id)

/

这里是查询语句

查询语句里有子查询

(select

max(COALESCE(last_replay_time,send_time))

from

nwhere

m.board_id

=n.board_id)

子查询的意思是

在uds_bbs_forum(表被从命名了

为n)表里

m表里的字段board_id等于n表里的board_id

意思是外面的查询和5、复杂表连接要学会分步骤处理子查询搜索的是同一条记录

在用coalesce函数得到的的值

等于

coalesce函数下的m表里的last_replay_time,send_time字段的记录

/

--(m表就是上面那个

n表就是子查询里的

虽然是一个表

但是现在有了区别)

个SQL语句是查询数据库表BTYW_YWSP_SQB

BTYWYWSPSQ0_中的若干列,有三个条件,即where后米娜三个and连接起来的,并按SPLSH列降序排序。

但条件不全,不知道你给的语句是否全还是有意的去掉了一些内容

第二个是数据更新语句:即更新BTYW_ZSDJ_FWB表中的若干列,形式是用Set把某列的值设置成你想要的值,这里的值都是问号。更新有条件,条件是LSH列的值为某个值时

因为这里对world有两次引用,如果不用别名,where那句就变成 WHERE world.continent=world.continent ,这个逻辑就有问题,不清楚,为了区分是哪次的引用,所 以加上别名 WHERE y.continent=x.continent

world是表名字,x或者y是给这个表定义的自定义名,便于区分

选择大陆,名称,面积从世界x区> =所有(选择面积从世界在y.continent = x.continent

Oracle通用函数,分组函数,子查询

例如, 'a 'normal' string' 。

注意 )Oracle中的字符串是严格区分大小写的 日期和字符只能在单引号中出现

)把列与列 列与字符连接在一起用 || 符号

)列的别名 紧跟列名 也可以在列名和别名之间加入关键字 AS 以便在别名中包含空格或特殊的字符并区分大小写 使用双引号

例子

SELECT last_name || is a || job_id AS Employee Details

FROM employees

where first_name like %s_ ;

通用函数

空值是无效的 未指定的 未知的或不可预知的值 空值不是空格或者 包含空值的数学表达式的值都为空值

这些函数适用于任何数据类型 同时也适用于空值

NVL (expr expr )

NVL (expr expr expr )

NULLIF (expr expr )

COALESCE (expr expr exprn)

( )NVL (expr expr ) >expr 为NULL 返回expr 不为NULL 返回expr 注意两者的类型要一致

( )NVL (expr expr expr ) >expr 不为NULL 返回expr 为NULL 返回expr expr 和expr 类型不同的话 expr 会转换为expr 的类型

( )NULLIF (expr expr ) >相等返回NULL 不等返回expr

( )COALESCE(expr expr exprn) >列表中个非空的表达式是函数的返回值 如果所有的表达式都是空值 最终将返回一个空值

条件表达式在SQL语句中使用IF THEN ELSE 逻辑 可以使用两种方法:–CASE表达式 CASE expr WHEN parison_expr THEN return_expr [WHEN parison_expr THEN return_expr WHEN parison_exprn THEN return_exprn ELSE else_expr] END

–DECODE函数 DECODE ( col | expression search result [ search result ] [ default] )

分组函数

组函数语法

SELECT [column ] group_function(column)

FROM ta搜索ble

[WHERE condition]

[GROUP BY column]

[ORDER BY column];

注意 在SELECT列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中

(所用包含于SELECT列表中 而未包含于组函数中的列都必须包含于GROUPBY子句中)

但包含在GROUP BY 子句中的列不必包含在SELECT列表中

且可以在在GROUP BY子句中包含多个列

不能在WHERE子句中使用组函数 但可以在HAVING子句中使用组函数

使用HAVING过滤分组

行已经被分组

使用了组函数

满足HAVING子句中条件的分组将被显示

SELECT column group_function

FROM table

[WHERE condition]

[GROUP BY group_by_expression]

[HAVING group_condition]

[ORDER BY column];

子查询

语法

SELECT select_list

FROM table

WHERE expr operator

(SELECT select_list

FROM table);

注意 子查询(内查询) 在主查询之前一次执行完成

子查询要包含在括号内

将子查询放在比较条件的右侧

除非进行Top N 分析 否则不要在子查询中使用ORDER BY子句

单行作符对应单行子查询 多行作符对应多行子查询

= 等于 IN 等于列表中的任何一个

> 大于 ANY 和子查询返回的任意一个值比较

>= 大于等于 ALL 和子查询返回的所有值比较

< 小于 EXISTS 功能等价于IN

<= 小于等于

<> 不等于

DECODE和CASE SELECT中除GROUP BY 子句以外的所有子句中 都可以使用单行子查询

在子查询中使用HAVING子句

SELECT select_list

FROM table

[GROUP BY group_by_expression]

[HAVING group_condition] expr operator

(SELECT select_list

FROM table);

在FROM子句中使用子查询 例子

SELECT a last_name a salary a department_id b salg

FROM employees a (SELECT department_id AVG(salary) salg

FROM employees

GROUP BY department_id) b

AND a salary > b salg;

有两个简单例子 以说明 exists 和 in 的效率问题

) select from T where exists(select from T where T a=T a) ;

T 数据量小而T 数据量非常大时 T <

) select from T where T a in (select T a from T ) ;

T 数据量非常大而T 数据量小时 T >>T 时 ) 的查询效率高

exists 用法

请注意 )句中的有颜色字体的部分 理解其含义

其中 select from T where T a=T a 相当于一个关联表查询 相当于

select from T T where T a=T a

但是 如果你当当执行 ) 句括号里的语句 是会报语法错误的 这也是使用exists需要注意的地方

exists(xxx) 就表示括号里的语句能不能查出记录 它要查的记录是否存在

因此 select 这里的 其实是无关紧要的 换成 也没问题 它只在乎括号里的数据能不能查找出来 是否存在这样的记录 如果存在 这 ) 句的where 条件成立

in 的用法

继续引用上面的例子

) select from T where T a in (select T a from T )

这里的 in 后面括号里的语句搜索出来的字段的内容一定要相对应 一般来说 T 和T 这两个表的a字段表达的意义应该是一样的 否则这样查没什么意义

打个比方 T T 表都有一个字段 表示工单号 但是T 表示工单号的字段名叫 ticketid T 则为 id 但是其表达的意义是一样的 而且数据格式也是一样的 这时 用 )的写法就可以这样

select from T where T ticketid in (select T id from T )

EXISTS作符

EXISTS 作符检查在子查询中是否存在满足条件的行

如果在子查询中存在满足条件的行

– 不在子查询中继续查找

– 条件返回TRUE

如果在子查询中不存在满足条件的行

– 条件返回FALSE

– 继续在子查询中查找

相关子查询

相关子查询按照一行接一行的顺序执行 主查询的每一行都执行一次子查询 子查询使用了主查询中的列

SELECT column column

FROM table outer

WHERE columnk operator (SELECT colum colum

FROM table

WHERE expr= outer expr);

相关更新

使用相关子查询依据一个表中的数据更新另一个表的数据

UPDATE table alias

SET column = (SELECT expression

FROM table alias

WHERE lumn = lumn);

相关删除

使用相关子查询依据一个表中的数据删除另一个表的数据

DELETE FROM table alias

WHERE column operator (SELECT expression

FROM table alias

WHERE lumn = lumn);

WITH子句

使用WITH子句 可以避免在SELECT语句中重复书写相同的语句块

WITH子句将该子句中的语句块执行一次 并存储到用户的临时表空间中

使用WITH子句可以提高查询效率

我们可以使用WITH Clause来定义一个query block 然后在SELECT statement的其它地方使用这个query block 如果在一个很复杂的 Query 里 我们必须重复地使用某个 subquery 那么使用WITH Clause可以降低Query的复杂度以及提高 performance 因为WITH Clause 所读出的资料会暂存在User的temporary tablespace中

WITH子句应用举例

WITH

dept_costs AS (SELECT d department_name SUM(e salary) AS dept_total

FROM employees e departments d

WHERE e department_id = d department_id

GROUP BY d department_name)

g_cost AS (SELECT SUM(dept_total)/COUNT() AS dept_g

FROM dept_costs)

SELECT

FROM dept_costs

WHERE dept_total > (SELECT dept_g

FROM g_cost)

ORDER BY department_name;

GROUP BY 扩展

带有ROLLUP和CUBE作的GROUP BY子句

使用带有ROLLUP和CUBE作的GROUP BY子句产生多种分组结果

ROLLUP产生n + 种分组结果 其是对GROUP BY子句的扩展

CUBE产生 的n次方种分组结果 其是对GROUP BY子句的扩展

注 其中的n指的是group_by_expression的数目

ROLLUP作符 ROLLUP产生n + 种分组结果 顺序是从右向左

SELECT [column ] group_function(column)

FROM table

[WHERE condition]

[GROUP BY [ROLLUP] group_by_expression]

[HAVING hing_expression]

[ORDER BY column];

CUBE作符 CUBE会产生类似于笛卡尔集的分组结果

SELECT [column ] group_function(column)

FROM table

[WHERE condition]

[GROUP BY [CUBE] group_by_expression]

[HAVING hing_expression]

[ORDER BY column];

GROUPING函数 能够实现更加直观的分组结果显示提示

SELECT [column ] group_function(column) [GROUPING(group_by_expression)]

FROM table

[WHERE condition]

[GROUP BY [ROLLUP] [CUBE] group_by_expression]

[HAVING hing_expression]

[ORDER BY column];

GROUPING函数可以和CUBE或ROLLUP结合使用

使用GROUPING函数 可以找到哪些列在该行中参加了分组

使用GROUPING函数 可以区分空值产生的原因

GROUPING函数返回 或

GROUPING SETS

GROUPING SETS是对GROUP BY子句的进一步扩充

使用GROUPING SETS可以实现在同一个查询中定义多个分组集

Oracle 对GROUPING SETS子句指定的分组集进行分组后用UNION ALL作将各分组结果结合起来

Grouping set 的优点

– 只进行一次分组即可

– 不必书写复杂的UNION语句

– GROUPING SETS中包含的分组项越多性能越好

SELECT department_id job_id mar_id g(salary)

FROM employees

GROUP BY GROUPING SETS ((department_id job_id) (job_id mar_id));

复合列

复合列是被作为整体处理的一组列的

使用括号将若干列组成复合列在ROLLUP或CUBE中作为整体进行作

在ROLLUP或CUBE中 复合列可以避免产生不必要的分组结果

连接分组集

将各分组集 ROLLUP 和CUBE用逗号连接 Oracle自动在GROUP BY子句中将各分组集进行连接

连接的结果是对各分组生成笛卡尔集

例如 GROUP BY GROUPING SETS(a b) GROUPING SETS(c d);

lishixinzhi/Article/program/Oracle/201311/18505

调用存储过程报错 MySQL server version for the right syntax to use near ‘NULL‘ at line 1?

这个错误通常是由于存储过程调用时传递的参数为NULL导致的。当存储过程期望传递参数时,如果参数SELECT FName FWeight CAST(FWeight/ AS INT) REPLICATE(FName CAST(FWeight/ AS INT))FROM T_Person为NULL,则可能会出现这种错误。

解决方案:

检查调用存储过程时是否传递了正确的参数,并确保没有传递NULL值。

如果存储过程允许参数为空,则需要在存储过程中对传入的参数进行判断处理,例如使用IFNULL或COALES例如 GROUP BY ROLLUP( department_id (job_id mar_id)); //小括号实现复合列CE函数将NULL值替换为其他值。

如果以上方法都无法解决问题,可以尝试更新MySQL版本或者检查MySQL安装是否有问题。

DB2到Oracle的SQL转换

select max(字段) from tes1. 取出2018和2019年所有的交易用户的交集t

本篇记录项目中DB2的SQL转为Oracle时的不同之处:

1、Oracle没有DROP TABLE IF EXISTS

2、db2函数用returns [类型],Oracle用return [类型]

3、db2用DECLARE来申明变量,Oracle申明变量在as/is后面

4、db2用SET来赋值变量,Oracle用:=

5、db2用ELSEIF,oracle用ELSIF

6、Oracle中的coalesce函数(用来获取个不为空的值)里面的数据类型,必须全部都跟列的

7、Oracle函数要加个END [函数名]

8、DB2为sysibm.dual,Oracle为dual

第三章 SQL语言元素(一)

同样 读取时的字段长度永远是声明时的字段长度 而且在比较字符串内容的时候 也需要考虑到空格的过滤

InterSystems SQL命令(也称为SQL语句)以关键字开头,后跟一个或多个参数。其中一些参数可能是子句或函数,由它们自己的关键字标识。

FIRST() – 返回个记录的值

InterSystems SQL关键字包括命令名称,函数名称,谓词条件名称,数据类型名称,字段约束,优化选项和特殊变量。它们还包括 AND , OR 和 NOT 逻辑运算符, NULL 列值指示符以及ODBC函数构造,例如 {d dateval} 和 {fn CONCAT(str1,str2)} 。

聚合函数是SQL固有函数,它计算列的所有值并返回单个聚合值。

这种写法只能在mac routine里,类文件里编译报错。

如果将用户提供的(外部)函数的使用配置为系统范围的选项,则该SQL语句只能调用用户提供的(外部)函数。默认为“否”。默认情况下,尝试调用用户提供的函数会发出 SQLCODE -372 错误。可以使用 %SYSTEM.SQL类的SetAllowExtrinsicFunctions() 方法在系统范围内配置SQL对外部函数的使用。若要确定当前设置,请调用 $SYSTEM.SQL.CurrentSettings() ,该显示显示“允许在SQL语句中使用外部函数”选项。

不能使用用户提供的函数来调用 %routine (名称以%字符开头的例程)。

尝试这样做会发出 SQLCODE -373 错误。

InterSystems SQL文字具有以下语法:

文字是一系列代表实际(文字)值的字符。它可以是数字或字符串。

空字符串是文字字符串;它由两个单引号字符( '' )表示。 NULL 不是文字值;它表示没有任何值。

注意:在嵌入式SQL中,不允许在字符串文字中使用以 ## 开头的一些字符序列,如“使用嵌入式SQL”一章的“文字值”中所述。此限制不适用于其他SQL调用,例如动态SQL。

使用单引号( ' )字符作为字符串定界符。 SQL兼容性支持双引号字符( “ )的使用,但由于与定界标识符标准冲突,因此强烈建议不要使用。将一对双引号字符 "" 解析为无效的定界标识符。并生成 SQLCODE -1 错误。

要在字符串中指定单引号字符作为字面字符,请指定一对这样的字符作为字面转义序列。

双竖条( || )是的SQL连接作符。

它可以用于连接两个数字、两个字符串或一个数字和一个字符串。

下划线( _ )作为SQL连接作符提供,以保证ObjectScript的兼容性。

此连接作符只能用于连接两个字符串。

如果两个作数都是字符串,并且两个字符串都具有相同的排序规则类型,则所得的级联字符串具有该排序规则类型。在所有其他情况下,连接的结果是排序类型 EXACT 。

使用 NULL 关键字表示没有指定值。

在SQL中, NULL 始终是表示数据值因任何原因未指定或不存在的方式。

SQL零长度字符串(空字符串)由两个单引号字符指定。

空字符串( " )与空字符串是不同的。

空字符串是一个已定义的值,一个不包含字符的字符串,一个长度为0的字符串。

一个零长度的字符串在内部由非显示字符 $CHAR(0) 表示。

注意:不建议使用SQL零长度字符串作为字段输入值或字段默认值。

在SQL编码中应避免使用SQL零长度字符串。

注意,不同的SQL length函数返回不同的值: length 、 CHAR_LENGTH 和 DATALENGTH 返回SQL长度。

$LENGTH 返回ObjectScript表示长度。

长度不计算尾随空格;

所有其他长度函数都计算末尾的空格。

NOT NULL数据约束要求字段必须接收一个数据值;

不允许指定NULL而不是值。

这个约束不阻止使用空字符串值。

SELECT 语句的 WHERE 或 HAVING 子句中的 IS NULL 谓词选择空值;

它不选择空字符串值。

它不会将空字符串值视为非空值。

COALESCE 函数从提供的数据中选择个非空值。

它将空字符串值视为非空值。

当 CONCAT 函数或 concenate 作符( || )连接一个字符串和一个 NULL 时,结果是 NULL 。

如下面的例子所示:

AVG、COUNT、MAX、MIN 和 SUM 聚合函数在执行作时忽略 NULL 值。

( COUNT 统计所有行,因为不可能有一个所有字段都为空值的记录。)

SELECT 语句的 DISTINCT 关键字在其作中包含 NULL ;

如果指定的字段有空值, DISTINCT 返回一个空行.

AVG 、 COUNT 和 MIN 、聚合函数受空字符串值的影响。

MIN 函数将空字符串视为最小值,即使存在值为0的行。

MAX 和 SUM 聚合函数不受空字符串值的影响。

对大多数SQL函数提供 NULL 作为作数将返回 NULL 。

任何以NULL作为作数的SQL算术作都返回 NULL 值。

因此,7 +零=零。

这包括二元运算加法( + )、减法( - )、乘法( )、除法( / )、整数除法( )和取模( # ),以及一元符号运算符加号( + )和减号( - )。

算术作中指定的空字符串将被视为0(零)值。

除法( / ),整数除法( ),或对空字符串( 6/ " )取模( # )会导致 错误。

然而,空字符串的长度被定义为长度为0。

如下面的例子所示:

如本例所示,SQL LENGTH 函数返回SQL长度。

可以使用 ASCII 函数将SQL的零长度字符串转换为 NULL ,示例如下:

但是,对标准 SQL 的某些系统间IRIS扩展对 NULL 和空字符串的长度的处理是不同的。

$LENGTH函数返回这些值的InterSystems IRIS内部表示: NULL 表示为长度为0的已定义值,SQL空字符串表示为长度为0的字符串。

该功能与ObjectScript兼容。

这些值的内部表示方式的另一个重要位置是 %STRING 、 %SQLSTRING 和 %SQLUPPER 函数,它们将空格附加到值中。

因为 NULL 实际上没有值,所以在它后面添加一个空格会创建一个长度为1的字符串。

但是一个空字符串确实有一个字符值,所以在它后面加上一个空格会创建一个长度为2的字符串。

如下面的例子所示:

注意,这个例子使用的是 CHAR_LENGTH ,而不是 LENGTH 。

因为 LENGTH 函数删除了末尾的空格,所以 LENGTH(%STRING(NULL)) 返回长度为0的字符串;

LENGTH(%STRING(")) 返回长度为2的字符串, 因为 %STRING 追加的是前导空格,而不是尾随空格。

当SQL NULL 输出到ObjectScript时,它由ObjectScript空字符串( "" )表示,长度为0的字符串。

当SQL零长度字符串数据输出到ObjectScript时,它由包含 $CHAR(0) 的字符串表示,该字符串长度为1。

在ObjectScript中,没有值通常用空字符串( "" )表示。

当这个值被传递到嵌入式SQL中时,它会被视为空值,如下面的例子所示:

如果指定了一个未定义的输入主机变量,嵌入式SQL将其值视为 NULL 。

当将NULL或空字符串值从嵌入式SQL传递到ObjectScript时, NULL 被转换为长度为0的字符串,空字符串被转换为长度为1的字符串。

如下面的例子所示:

在下面的例子中,SQL的空字符串加上一个空格被传递为长度为2的字符串:

impala条件判断函数

1、coalesce(T v1, T v2, ...)

返回个不为null的v,全部为null则返回null

2、decode(T expression, T search5.COALESCE函数1, T result1 [, T search2, T result2 ...] [, T default] )

根据t的值返回不同result

3、if(BOOLEAN condition, T ifTrue, T ifFalseOrNull)

4、ifnull(a,b)、isnull(a,b)、nvl(a,b)

a为null时返回b,否则返回a

5、nullif(T expr1, T expr2)

nullif(a,b) 以下例子实现了对department_id job_id分组 对job_id mar_id分组 最终形成两个分组a=b时返回null,否则返回a;a为null时,返回null

6、nullifzero(T numeric_expr)

0返null

7、nullvalue(T expression)

null返回true,否则返回false

8、nvl2(T a, T ifNull, T ifNotNull)

nvl2(a,b,c) a为null时返回c,否则返回b

9、zeroifnull(T numeric_expr)

null返0

tgresql 两个null比较

本篇文章还是学习《程序员的SQL金典》内容的记录 此次将讲解的是SQL SERVER常用的其它函数 (其它数据库这里就不罗列在SQL中, NULL 的长度是没有定义的(它返回 < NULL > )。了 想看更多的可以关注《程序员的SQL金典》)

tgresql中有COALESCE函数,可以替换null,LZ可以使用这个函数来试下。

COALESCE(A.name,'') = COALESCE(B.name,'') 这样就会把null替换为0 那么就会值相同了,出来的结果中 LZ要注意看下是不是正确的。