【问题标题】:COALESCE doesn't return resultCOALESCE 不返回结果
【发布时间】:2020-12-18 20:45:08
【问题描述】:

数据库:SQL Server 2008

我有这个 SQL 查询:

DECLARE @var FLOAT;
SET @var = (SELECT field FROM table);
-- SELECT @var returns [NULL]

SELECT COALESCE(@var, 'NI');

[NULL]@var 变量的中间结果。我希望 COALESCE 返回“NI”,但是我收到以下错误消息:

SQL 错误[8114][S0005]:将数据类型 varchar 转换为浮点数时出错。

我做错了什么?

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加一个标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或者完全是其他东西。
  • @marc_s 根据错误信息,这看起来像sql-server
  • @Mureinik:看起来 - 同意 - 但如果 OP 真的告诉我们会更好
  • @marc_s 当然,这里没有争论
  • 同样,official docs 应该始终是您尝试找出函数为何如此行事的第一个调用端口。

标签: sql sql-server tsql


【解决方案1】:

SELECT COALESCE(@var, 'NI');

DBMS 发现您想用另一个值替换浮点数 @var,以防它为空。为此,它也尝试将第二个参数设为浮点数。但是'NI' 当然不能转换为浮点数。

让查询返回一个字符串,即将你的浮点数转换为字符串。例如:

SELECT COALESCE(CONVERT(VARCHAR(50), @var, 3), 'NI');

【讨论】:

  • 这意味着无论使用结果是接收浮点的字符串表示,有时实际上可能是字符'NI'。虽然它“运行”,但我还建议它是一个非常糟糕的设计选择,我什至会说这是一种代码气味,而且是一种非常强烈的气味。应该建议 OP 重新考虑为什么他们甚至希望这个工作,很可能有更好的方法。
【解决方案2】:

正如Coalesce 中解释的那样:“返回具有最高数据类型优先级的表达式 的数据类型。如果所有表达式都不可为空,则结果的类型为不可空。”

更一般地说,data type precedence 的规则规定,当您在表达式 (COALESCE(@var, 'NI')) 中组合 varchar ('NI') 和 float (@var) 时,varcharconverted implicitlyfloat

'NI' 不是很好的float(也不是witch)。

【讨论】:

    【解决方案3】:

    值'NI'只是一个字符串(char)吗?我希望这样。 COALESCE 期望兼容的类型作为参数。在您的情况下,它是一个浮点数和一个 char/varchar。因此,您必须首先将浮点数转换为 char,然后应用 COALESCE 函数:

    print COALESCE(CAST(@var AS CHAR), 'NI');
    

    【讨论】:

    • @MatBailie From char: "当 n 未在数据定义或变量声明语句中指定时,默认长度为 1。如果 n,默认长度为 30。”最佳做法是始终指定长度。
    猜你喜欢
    • 2015-06-13
    • 2019-06-18
    • 2020-04-05
    • 2018-03-19
    • 2011-07-17
    • 2015-09-29
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多