我尝试如下选择:
CREATE TABLE v_test
(
id int,
name char(4)
);
INSERT INTO v_test
SELECT 1, NULL
UNION
SELECT 2, NULL
SELECT
id,
CASE
WHEN name IS NULL
THEN ' '
ELSE CAST((LEFT(name, 2) + ':' + SUBSTRING(name, 3, 2) + ':00') AS TIME)
END AS test,
name
FROM
v_test;
SELECT
id,
CASE
WHEN name IS NULL
THEN ' '
ELSE '0'
END AS test,
name
FROM v_test;
这些查询的结果如下:
您可以看到,在函数转换中不影响结果的情况。有人可以帮我解释一下细节吗?
答案 0 :(得分:4)
case
表达式将仅返回一个type
,在您的第一个版本中,您有两个type
,一个是varchar
,另一个是time
。
如果我们查看precedence
类型,那么time
的优先级要高于varchar
。
因此,您需要进行转换:
select id,
(case when name is null
then ' '
else cast(CAST((LEFT(name,2)+ ':' + SUBSTRING(name,3,2)+':00') AS TIME) as varchar(255))
end) as test,
name
from v_test;
答案 1 :(得分:1)
句子“您可以看到,在函数转换中不受影响的结果情况。” 恐怕没有任何意义。我认为您要问的是为什么值' '
显示为00:00:00.0000000
?
根据文档CASE (Transact-SQL) - Return Types:
从以下类型的集合中返回最高优先级类型 result_expressions和可选的else_result_expression。欲了解更多 信息,请参阅Data Type Precedence (Transact-SQL)。
如果我们也参考上面的链接文档,这将提供(当前)数据类型优先级:
SQL Server对数据类型使用以下优先顺序:
- 用户定义的数据类型(最高)
- sql_variant
- xml
- datetimeoffset
- datetime2
- 日期时间
- smalldatetime
- 日期
- 时间
- 浮动
- 真实
- 十进制
- 金钱
- 小钱
- bigint
- int
- smallint
- tinyint
- 位
- ntext
- 文本
- 图片
- 时间戳
- uniqueidentifier
- nvarchar(包括nvarchar(max))
- nchar
- varchar(包括varchar(max))
- char
- varbinary(包括varbinary(max))
- 二进制(最低)
请注意,time
的优先级比varchar
高得多,因此您的值' '
被隐式转换为time
和CONVERT(time,' ') = '00:00:00.0000000'
。