加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 为什么是IsNull(LTrim(RTrim(Lower(null))),-1)是*?

发布时间:2020-12-12 08:26:58 所属栏目:MsSql教程 来源:网络整理
导读:今天我正在工作场所测试一下,遇到这个 情况1: Declare @a nvarchar(20)Set @a = nullSelect IsNull(LTrim(RTrim(Lower(@a))),-1) 情况2: Select IsNull(LTrim(RTrim(Lower(null))),-1) 情况1的结果为-1,但在情况2中为* 在这两种情况下,我都期待同样的结果.
今天我正在工作场所测试一下,遇到这个

情况1:

Declare @a nvarchar(20)
Set @a = null
Select IsNull(LTrim(RTrim(Lower(@a))),-1)

情况2:

Select IsNull(LTrim(RTrim(Lower(null))),-1)

情况1的结果为-1,但在情况2中为*
在这两种情况下,我都期待同样的结果.任何原因?

解决方法

没有数据类型的声明,在这种情况下,null被声明为varchar(1).您可以通过将结果选择到#temp表来观察这一点:
Select IsNull(LTrim(RTrim(Lower(null))),-1) as x INTO #x;
EXEC tempdb..sp_help '#x';

您会看到以下结果:

Column_name   Type      Length
-----------   -------   ------
x             varchar   1

因为-1不能适应varchar(1),所以你会得到*作为输出.这类似于:

SELECT CONVERT(VARCHAR(1),-1);

如果要折叠为字符串,则建议将整数括在单引号中,以避免由整数< - >引起混淆.不需要的字符串转换

SELECT CONVERT(VARCHAR(1),'-1'); -- yields "-"
SELECT CONVERT(VARCHAR(30),'-1'); -- yields "-1"

我不会对SQL Server如何处理明确提供为null的“值”做出任何假设,特别是当复杂表达式使得难以预测哪些评估规则可能胜过数据类型优先级时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读