首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在sql server中使用like查询二进制列

在sql server中使用like查询二进制列
EN

Stack Overflow用户
提问于 2013-04-24 17:23:54
回答 3查看 17.3K关注 0票数 9

我使用的是SQL Server 2008。在我的表中,有一个名为TestData的列,类型为binary

TestData列中的示例数据为

代码语言:javascript
运行
复制
1. 0x0001DC780C0030373156635D0C00B8840301009A0600AC
2. 0x0301DC780C0030373156385D0C006499C401009A0600AC

编写了以下两个查询,以获取TestData以"0x0001“开头的行。但它们都不起作用。

代码语言:javascript
运行
复制
SELECT * 
FROM T_TRANSACTION 
WHERE  CAST(Indicium AS nvarchar(MAX)) LIKE '0x0001%'

----No results found

SELECT * 
FROM T_TRANSACTION 
WHERE  CAST(Indicium AS nvarchar(MAX)) LIKE '0x0001%'

----Returns all the rows

请更正查询以获得预期结果

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-24 17:34:34

不要对其进行转换,但要将其视为一个范围(就像对待日期时间值一样)

代码语言:javascript
运行
复制
DECLARE @foo TABLE (TestData varbinary(100) NOT NULL);
INSERT @foo (TestData) VALUES
         (0x0001DC780C0030373156635D0C00B8840301009A0600AC),
         (0x0001AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA),
         (0x0001AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF),
         (0x0301DC780C0030373156385D0C006499C401009A0600AC),
         (0x0301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF),
         (0x0302000000000000000000000000000000000000000000);

SELECT *
FROM @foo
WHERE TestData >= 0x0001 AND TestData < 0x0002;

-- added more digit for clarity of what actually happens
SELECT *
FROM @foo
WHERE TestData >= 0x00010000 AND TestData < 0x00020000;

SELECT *
FROM @foo
WHERE TestData >= 0x0001AA AND TestData < 0x0001AB;

SELECT *
FROM @foo
WHERE TestData >= 0x0301 AND TestData < 0x0302;

这样做的好处是可以在TestData上使用索引

编辑,您只需指定所需的位数

票数 15
EN

Stack Overflow用户

发布于 2013-04-24 17:58:53

对于像比较这样的前缀,gbn的答案就可以了。对于类似于字符串搜索的真实等价物,您可以使用如下所示:

(从@gbn借用模式和示例数据)

代码语言:javascript
运行
复制
DECLARE @foo TABLE (TestData varbinary(100) NOT NULL);
INSERT @foo (TestData) VALUES
         (0x0001DC780C0030373156635D0C00B8),
         (0x0001AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA),
         (0x0001AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF),
         (0x0301DC780C0030373156385D0C006499C401009A0600AC),
         (0x0301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF),
         (0x0302000000000000000000000000000000000000000000);

SELECT *
FROM @foo
WHERE CAST(TestData AS VARCHAR(MAX)) LIKE '%'+CAST(0xDC78 AS VARCHAR(MAX))+'%';

当您将二进制值转换为VARCHAR时,它所做的全部工作就是将原始比特视为字符串流。它不会神奇地将其转换为字符串表示形式。考虑下面的示例:

代码语言:javascript
运行
复制
select cast(0x41 as varchar(10));     -- Result: A
select cast(0x414263 as varchar(10)); -- Result: ABc

因为字节0x41或序数65在标准拉丁语代码页中是'A‘。

票数 3
EN

Stack Overflow用户

发布于 2020-03-31 17:28:34

不要将字节数组用作字符串,而应将其用作数字。

你所需要做的就是:

Indicium * FROM T_TRANSACTION WHERE

>= 0x0001

或者,如果你想得到一个科学的:

Indicium >=0x0001DC780C0030373156635D0C00B8840301009A0600AC的

SELECT * FROM T_TRANSACTION

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16188257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档