SQL HASHBYTES 函数在 CASE WHEN/IIF 中使用时返回奇怪的输出

标签 sql sql-server stored-procedures hashbytes

我编写了一个存储过程,用于散列特定列的值。我需要在 CASE WHEN 或 IIF 语句中使用此 HASHBYTES 函数,如下所示:

DECLARE @Hash varchar(255) = 'testvalue'
SELECT    IIF(1=1, HASHBYTES('SHA1',@Hash), @Hash)
SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) END  AS Hashcolumn

我无法理解为什么我从上述查询中得到不同的输出?似乎每当我在 CASE WHEN/IIF 语句中添加 ELSE 时,它都会返回一串奇怪的字符(如上例中的 ü<þ+OUL'RDOk{­\Ìø)。

谁能告诉我为什么会这样?我需要使用 CASE WHEN 或 IIF。

谢谢大家

最佳答案

IIF 返回带有 highest precedence 的数据类型来自 true_value 和 false_value 中的类型。在本例中,它是 @Hash1,它是 varchar(255),因此您的结果将转换为 varchar(255)。见下文。

DECLARE @Hash varchar(255) = 'testvalue'
SELECT cast(HASHBYTES('SHA1',@Hash) as varchar(255))

同样,CASE 的工作方式相同。但是,如果您不添加与数据类型冲突的 ELSE 或另一个 WHEN,它将起作用。这是因为隐含了 ELSE NULL。即

SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) END

但是,如果您添加另一项检查,则优先级开始生效,并且它会被转换。

SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) WHEN 1=2 THEN @Hash END AS Hashcolumn 
SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) ELSE @Hash END AS Hashcolumn 

关于SQL HASHBYTES 函数在 CASE WHEN/IIF 中使用时返回奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50240357/

相关文章:

mysql - 从存储过程输出 JOINS 的不同值

mysql - 基于巧妙的常见查询的 SQL 移动平均线行不通

mysql - 如何更新mysql中的一行并插入新记录?

sql - 在存储过程中的 where 子句中使用 If

mysql - 如何向现有表添加 n 个列,新列应具有现有列的聚合

sql - 从年度条目创建范围映射记录

c# - 为什么 "SELECT * FROM user"会抛出语法错误?

.net - System.Data.SQLConnection 的跟踪和诊断

sql - 如何使用通过自身联接检索到的数据来更新表?

php - 将参数添加到 PHP mssql 查询