MySQL中的IFNULL()和COALESCE()在字符串上无法替换

14

我的语句应该用'no name'替换每个空的title_column,但它没有达到效果:

SELECT COALESCE(main_table.title_column, 'no name') AS title
FROM main_table;
< p > IFNULL() 的行为方式相同。

我做错了什么?


3
你是否看到了空字符串值而不是 null 值? - Ilion
显然,那是这种情况。另一个用户发布了解决方案... - kiltek
4个回答

25

COALESCEIFNULL 仅替换 NULL 值,你的表中似乎包含空字符串:

SELECT
  COALESCE(NULLIF(main_table.title_column, ''), 'no name') AS title
FROM main_table;

4
在MySQL中,NULL字符串和空字符串('')是不同的。
您有几个选项,为了保持一致性,我使用CASE...
CASE WHEN main_table.title_column = '' THEN 'no name' ELSE main_table.title_column END

其他选项可能是在另一个答案中展示的COALESCE(NULLIF())(它使用NULLIF()将空字符串转换为NULL,然后像您想要的那样使用coalesce)

或者可能只需使用IIF()缩短CASE语句...

IIF(main_table.title_column = '', 'no name', main_table.title_column)

2
如果您更喜欢使用一种功能性的方式来提供解决方案, 您可以始终使用以下内容:
DELIMITER $$
-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
-- Note: add your server side comments to remember what this routine does on your Api
-- --------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS `IfNullOrEmpty`$$
CREATE FUNCTION `IfNullOrEmpty`(s TEXT, value TEXT) RETURNS TEXT
NOT DETERMINISTIC
READS SQL DATA
BEGIN

IF ( (s is null) OR (trim(s) = '')  ) THEN
    return value;
END IF;
return s;    
END$$

使用方法:

SELECT IfNullOrEmpty(t.FieldName,'No Name Given') as Name FROM cms_Table t

1

我在MySQL中使用了这个解决方案。

SELECT IF((TRIM(main_table.title_column) = ''),'no name', COALESCE(main_table.title_column, 'no name')) AS title FROM main_table

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接