【问题标题】:SQL Server : CASE statement varbinary comparison has unexpected behaviorSQL Server:CASE 语句 varbinary 比较具有意外行为
【发布时间】:2016-04-02 18:28:16
【问题描述】:

更新: 似乎有一些证书或规则在使用加密列数据的打开查询上运行。我发现以下会产生一个未加密的值 concat 'more'。我将必须与我们的 DBA 核实可能导致此行为的原因。

case when s.EncryptedColumn is not null then concat(s.[EncryptedColumn], ' more') else s.[RawColumn] end

我正在尝试将 null 与 varbinary(16) 列进行简单比较,但是我无法让结果返回 true。

这是我尝试过的:

尝试 1:

select 
    s.[EncryptedColumn], 
    (case when s.[EncryptedColumn] is not null 
            then s.[EncryptedColumn] 
            else s.[RawColumn] 
     end) as 'result'

结果 1:加密数据,原始数据

尝试 2:

select 
    datalength(s.[EncryptedColumn]), 
    (case when datalength(s.[EncryptedColumn]) > 0 
            then s.[EncryptedColumn] 
            else s.[RawColumn] 
     end) as 'result'

结果2:加密数据长度(16),原始数据

有什么想法吗?

【问题讨论】:

  • 不清楚你在问什么。这些结果在哪里?我看不到 result1 之后的文本如何与尝试 1 中的查询相关联?
  • coalesce(EncryptedColumn, RawColumn) 是否满足您的需求?顺便说一句,datalength(null) 为空。所以这可能是第二次尝试的一个问题。
  • 对@MartinSmith 的困惑感到抱歉。我有一个非空加密列,并且两个选择都返回证据表明它在所选的第一列中不为空。只有case的结果总是假的。
  • @marc_s,感谢您进行格式编辑。我正在使用 SQL Server 2014
  • 了解您正在处理的价值观可能会有所帮助。第一次尝试表明您真的想要coalesce()。第二个建议也许你正在做datalength(0x)。还有更多的故事吗?我当然不想看到你加密的数据。

标签: sql sql-server-2014 comparison-operators varbinary case-statement


【解决方案1】:

如果我猜对了,你应该看看here

使用 ISNULL(DATALENGTH(Content), -1) 代替,这样您就可以 区分长度 0 和 NULL。或者只使用 DATALENGTH(Content)

【讨论】:

    【解决方案2】:

    更新: 似乎有一些证书或规则在使用加密列数据的打开查询上运行。我发现以下会产生一个未加密的值 concat 'more'。我必须与我们的 DBA 核实可能导致这种行为的原因。

    case when s.EncryptedColumn is not null then concat(s.[EncryptedColumn], ' more') else s.[RawColumn] end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 2018-01-09
      • 1970-01-01
      • 2015-07-31
      相关资源
      最近更新 更多