Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么这个MySQL函数返回null?

为什么这个MySQL函数返回null?
EN

Stack Overflow用户
提问于 2009-05-27 09:44:03
回答 4查看 9.5K关注 0票数 1

描述:实际运行的查询返回了4个结果,从下面可以看到,我所做的只是连接这些项然后返回,但出乎意料的是,它是空的。

我认为代码是不言自明的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELIMITER |

DROP FUNCTION IF EXISTS get_idiscussion_ask|

CREATE FUNCTION get_idiscussion_ask(iask_id INT UNSIGNED) RETURNS TEXT DETERMINISTIC
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE body varchar(600);
  DECLARE created DATETIME;
  DECLARE anonymous TINYINT(1);
  DECLARE screen_name varchar(64);
  DECLARE result TEXT;
  DECLARE cur1 CURSOR FOR SELECT body,created,anonymous,screen_name from idiscussion left join users on idiscussion.uid=users.id where idiscussion.iask_id=iask_id;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  SET result = '';
  OPEN cur1;
  REPEAT
    FETCH cur1 INTO body, created, anonymous, screen_name;
    SET result = CONCAT(result,'<comment><body><![CDATA[',body,']]></body>','<replier>',if(screen_name is not null and !anonymous,screen_name,''),'</replier>','<created>',created,'</created></comment>');
  UNTIL done END REPEAT;
  CLOSE cur1;

  RETURN result;
END |

DELIMITER ;

mysql> DELIMITER ;
mysql> select get_idiscussion_ask(1);
+------------------------+
| get_idiscussion_ask(1) |
+------------------------+
| NULL                   |
+------------------------+
1 row in set (0.01 sec)



mysql> SELECT body,created,anonymous,screen_name from idiscussion left join users on idiscussion.uid=users.id where idiscussion.iask_id=1;
+------+---------------------+-----------+-------------+
| body | created             | anonymous | screen_name |
+------+---------------------+-----------+-------------+
| haha | 2009-05-27 04:57:51 |         0 | NULL        |
| haha | 2009-05-27 04:57:52 |         0 | NULL        |
| haha | 2009-05-27 04:57:52 |         0 | NULL        |
| haha | 2009-05-27 04:57:53 |         0 | NULL        |
+------+---------------------+-----------+-------------+
4 rows in set (0.00 sec)

对于那些不认为代码是不言自明的人:

函数为什么返回NULL**?**

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-27 09:50:51

将变量和输入参数重命名,它们是不明确的。

此查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT  body, created, anonymous, screen_name
FROM    idiscussion
LEFT JOIN
        users
ON      idiscussion.uid = users.id
WHERE   idiscussion.iask_id = iask_id

返回以前声明的变量(即NULL),而不是表列。

用下划线准备变量名和输入参数名。

另外,你还会做一项额外的任务来完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FETCH cur1 INTO body, created, anonymous, screen_name;
SET result = CONCAT(result,'<comment><body><![CDATA[',body,']]></body>','<replier>',if(screen_name is not null and !anonymous,screen_name,''),'</replier>','<created>',created,'</created></comment>');

处理程序在done失败后设置FETCH,但仍然分配result

将处理程序更改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE EXIT HANDLER FOR SQLSTATE '02000' RETURN result;

最后:在MySQL中,这可以通过一个查询来完成。没有必要用函数来完成它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT  GROUP_CONCAT(CONCAT(result,'<comment><body><![CDATA[',body,']]></body>','<replier>',if(screen_name is not null and !anonymous,screen_name,''),'</replier>','<created>',created,'</created></comment>') SEPARATOR '')
FROM   idiscussion
LEFT JOIN
       users
ON     idiscussion.uid=users.id
WHERE  idiscussion.iask_id = @_iask_id
票数 3
EN

Stack Overflow用户

发布于 2009-05-27 10:39:01

请记住,将任何字符串与NULL连接在一起返回NULL。试试这个测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> SET @s = 'test string';
mysql> SET @s = CONCAT(@s, '<tag>', NULL, '</tag>');
mysql> SELECT @s;

这将返回NULL。

因此,当您遍历游标时,如果bodycreated列在任何行上为NULL,则result变为NULL。然后,在循环的后续迭代中,与空result连接的任何东西都没有效果;它仍然是空的。

试着做这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REPEAT
    FETCH cur1 INTO body, created, anonymous, screen_name;
    SET result = CONCAT(result, 
      '<comment><body><![CDATA[', 
      COALESCE(body, ''),
      ']]></body>', 
      '<replier>', 
      IF(COALESCE(anonymous, 0) != 0, COALESCE(screen_name, ''), ''), 
      '</replier>',
      '<created>',
      COALESCE(created, ''),
      '</created></comment>'
    );
UNTIL done END REPEAT;

COALESCE()函数在标准SQL中是一个有用的函数。它返回第一个非空参数。

票数 1
EN

Stack Overflow用户

发布于 2009-08-26 15:10:33

CONCAT_WS(分离器,str1,str2,.)CONCAT_WS()表示与分离器连接,是一种特殊形式的CONCAT()。第一个参数是其余参数的分隔符。分隔符在要连接的字符串之间添加:分隔符可以是字符串,其余的参数也可以是字符串。如果分隔符为空,则结果为空。函数在分隔符参数之后跳过任何空值。

mysql>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT CONCAT_WS(",","First name","Second name","Last Name");
   -> 'First name,Second name,Last Name'

mysql>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT CONCAT_WS(",","First name",NULL,"Last Name");
   -> 'First name,Last Name'

在MySQL 4.0.14之前,CONCAT_WS()跳过空字符串和空值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/917091

复制
相关文章
JavaScript基础:typeof null 为什么返回object
null本身实际上是基本类型,但是Javascript在存储的时候,会将不同的对象在底层存储都使用二进制的方式存储,在Javascript中如果二进制的前三位都为0的话就会被判断为object,null的二进制存储表示形式为全是0,自然前三位也是0,因此执行typeof时会返回”object”。
IT工作者
2022/01/26
3K0
File.listFiles()返回null
如果已知ROOT路径存在,root.exists()返回true。且是文件夹。那么原因则是没有获取READ_EXTERNAL_STORAGE权限。
平凡的学生族
2019/05/25
5.1K0
Python 函数为什么会默认返回 None?
Python 有一项默认的做法,很多编程语言都没有——它的所有函数都会有一个返回值,不管你有没有写 return 语句。
Python猫
2020/08/18
2.2K0
NDK学习笔记:线程JNIEnv,JavaVM,JNI_OnLoad(GetEnv返回NULL?FindClass返回NULL?)
nativeThreadEnvTest打算实现这样一个功能:for循环调用MainActivity.getUuid方法,打印出5串不同的UUID。听上去很简单,逻辑代码如下:
全栈程序员站长
2022/07/30
2.8K0
NDK学习笔记:线程JNIEnv,JavaVM,JNI_OnLoad(GetEnv返回NULL?FindClass返回NULL?)
为什么 MySQL 不推荐默认值为 null ?
通常能听到的答案是使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引,所以上述说法有漏洞。
芋道源码
2021/01/25
3.9K0
为什么 MySQL 不推荐默认值为 null ?
通常能听到的答案是使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引,所以上述说法有漏洞。
Java技术栈
2020/12/18
4.9K0
MySQL datetime(0) NULL DEFAULT NULL 报错
datetime 默认设置为 CURRENT_TIMESTAMP时,CURRENT_TIMESTAMP 的长度同样不能指定为 0
静谧星空TEL
2021/04/27
3.8K0
sql =null is null_sqlserver isnull函数
3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。
全栈程序员站长
2022/11/01
7280
MySQL字段null和not null学习思考
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
2019/11/04
2.8K0
thrift:返回null的解决办法
本文讨论了Thrift框架返回null的问题,并提供了相应的解决方案。文章提到,Thrift不允许服务接口返回null,否则会抛出异常。为了解决这个问题,开发人员可以捕获ThriftApplicationException异常,并根据异常类型进行相应的处理。如果异常类型是TApplicationException,并且异常原因是missing_result,那么可以返回null。否则,应该继续向上抛出异常。
10km
2018/01/03
3.7K0
typeof运算对于null会返回“Object"
您也许会问,为什么 typeof 运算符对于 null 值会返回 "Object"。这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
阮键
2019/08/07
2.2K0
MySQL timestamp NOT NULL插入NULL的问题
如果该参数不开启,则对timestamp NOT NULL插入NULL值,不报错,无warning,插入后的值为当前时间
爱撸猫的杰
2019/03/28
2.7K0
关于mysql给列加索引这个列值中有null的情况
在需求中由于要批量查数据,且表中数据量挺大(2300万条记录) 且查询条件的这两个字段没有加索引,为了增加查询速度,现在需要去为这两个字段添加索引。 刚开始加索引想到的问题:
袁新栋-jeff.yuan
2020/08/26
4.3K0
MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!
这种说法愈演愈烈,甚至被很多同学奉为真理。咱啥话也不说,举个例子。假如我们有个表s1,结构如下:
帅地
2019/10/30
4.5K0
MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!
为什么MySQL不建议使用NULL作为列默认值?
blog.csdn.net/qq_30549099/article/details/107395521
肉眼品世界
2021/03/09
4.8K0
以太坊执行miner.start返回null
问题场景 最近技术群中的朋友经常问到这样的问题,环境搭建已经搭建好,geth节点也成功启动,可为什么当执行miner.start()方法时却没有挖矿,返回null。 其实,不仅仅这些朋友,本人在启动最
程序新视界
2017/12/29
2.4K0
php json_decode 返回 null 乱码问题
编码错乱的昵称存在json字符串里,php调用json_decode(xxx, true) 失败,返回null的问题。
shirishiyue
2020/01/01
3.3K0
MySQL NULL值特性
NULL是一种“没有类型”的值,通常表示“无值”,“未知值”,“缺失值”,“超界”,“不在其中”等,我们在日常运用中很容易和NULL字符串混淆,这里大致整理了下NULL值的一些特性,以便能够正确使用NULL值。
星哥玩云
2022/08/17
2.7K0
MySQL NULL值特性
React报错之ref返回undefined或null
原文链接:https://bobbyhadz.com/blog/react-ref-returns-undefined-or-null[1]
chuckQu
2022/08/19
1.3K0
点击加载更多

相似问题

为什么这个MySQL存储函数返回null?

11

为什么这个函数返回null?

20

为什么这个函数总是返回null

15

为什么这个模式函数返回null?

11

为什么这个mysql查询只返回null?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文