【问题标题】:SQL WHERE clause with binary带有二进制的 SQL WHERE 子句
【发布时间】:2011-08-11 12:33:20
【问题描述】:

我有一个带有varbinary(max) 列的 SQL Server 数据库表(即create table 命令中的Data VarBinary(max))。

是否可以在二进制数据中使用某种模式匹配来执行where 子句?

例如,使用 C# .NET SqlCommand 对象,我发现我可以进行类似select * from TableName where Data = 0x4638763849838709 go 的查询,其中的值是完整的数据列值。但我希望能够仅对部分数据进行模式匹配,例如select * from TableName where Data = 0x%3876% go

谢谢。

【问题讨论】:

  • 二进制数据是特定文档/文件类型的表示吗?

标签: sql sql-server where


【解决方案1】:
SELECT * 
FROM myTable 
WHERE CONVERT(varchar(max),myvarbinaryfield,2) like '%46387638%'

也许我应该使用 OP 的示例:

select * 
from TableName 
where CONVERT(varchar(max),Data,2) like '%3876%'

【讨论】:

  • 请添加有关此代码如何回答问题的说明
【解决方案2】:

对于您在问题中给出的示例

WITH t(c) AS
(
SELECT CAST(0x4638763849838709 AS VARBINARY(MAX)) 
)
SELECT *
FROM t
WHERE CHARINDEX(0x3876,c) > 0

【讨论】:

  • 当您知道要搜索的特定连续十六进制字符范围时,这很有效。它适用于我的特殊情况。
  • 这正是我正在寻找的案例。我有无法解码的编码二进制值,但我需要使用这个值在数据库中搜索。
  • 但是,我们如何与 PreparedStatements 一起做到这一点?
【解决方案3】:

SQL Server 不提供任何函数来搜索VARBINARY 字段,因此这是不可能的。

请参阅this 相关的 SO 问题和答案。

基本上,您需要提取二进制信息并使用能够理解其格式的工具来搜索它。不能直接在 SQL Server 中完成。

【讨论】:

    【解决方案4】:

    这里在黑暗中拍摄,但您可以先将字段转换为 VARCHAR(MAX),然后使用 LIKE 语句进行比较。

    例如

    SELECT *
    FROM TableName
    WHERE CONVERT(VARCHAR(MAX), Data) LIKE '%2345%'
    

    【讨论】:

    • 这对我不起作用,因为它确实尝试将 VARBINARY 编码为字符串,所以我得到的是乱码,而不是十六进制值的字符串表示。 @Martin Smith 的回答最接近所问的内容。
    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多