9

我正在使用 SQL Server 2008。在我的表中,我有一个名为TestDatatype的列binary

TestData 列中的样本数据是

1. 0x0001DC780C0030373156635D0C00B8840301009A0600AC
2. 0x0301DC780C0030373156385D0C006499C401009A0600AC

在下面编写了两个查询以获取 TestData 以“0x0001”开头的行。但他们都没有工作。

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

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

4

3 回答 3

15

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

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 上使用索引的好处

编辑,您只需指定所需数量的数字

于 2013-04-24T09:34:33.870 回答
3

对于领先的前缀 LIKE 比较,gbn 的答案就可以了。对于字符串搜索的真正LIKE 等价,您可以按如下方式使用 LIKE:(
从 @gbn 借用架构和示例数据)

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 时,它所做的只是将原始位视为字符串流。它不会神奇地将其转换为字符串表示形式。考虑下面的例子:

select cast(0x41 as varchar(10));     -- Result: A
select cast(0x414263 as varchar(10)); -- Result: ABc

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

于 2013-04-24T09:58:53.483 回答
1

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

您需要做的就是:

SELECT * FROM T_TRANSACTION WHERE Indicium >= 0x0001

或者如果你想得到一个特定的:

SELECT * FROM T_TRANSACTION WHERE Indicium >=0x0001DC780C0030373156635D0C00B8840301009A0600AC

于 2020-03-31T09:28:34.383 回答