14

我的声明应该用'no name'替换每个 ,但它没有:title_column

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

IFNULL()行为方式相同。

我究竟做错了什么 ?

4

4 回答 4

25

COALESCE并且IFNULL仅替换NULL值,您的表似乎包含空字符串:

SELECT
  COALESCE(NULLIF(main_table.title_column, ''), 'no name') AS title
FROM main_table;
于 2012-01-18T10:02:39.003 回答
4

在 MySQL 中,NULL字符串和空 ( '') 字符串不是一回事。

您有几个选择,为了保持一致性,我使用 CASE ...

CASE WHEN main_table.title_column = '' THEN 'no name' ELSE main_table.title_column END

其他选项可能是另一个答案上显示的 COALESCE(NULLIF()) (它使用 NULLIF() 将空字符串转换为 NULL,然后根据需要使用合并)

或者可能只是 IIF() 来缩短 CASE 语句......

IIF(main_table.title_column = '', 'no name', main_table.title_column)
于 2012-01-18T10:03:06.297 回答
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
于 2013-04-05T14:55:29.623 回答
1

将此解决方案用于MySql,

SELECT IF((TRIM(main_table.title_column) = ''),'no name', COALESCE(main_table.title_column, 'no name')) AS title FROM main_table
于 2012-01-18T10:23:27.180 回答