我正在使用SQL Server 2008.在我的表中,我有一个名为TestData
的列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
请更正查询以获得预期结果
答案 0 :(得分:12)
不要转换它,但是视为一个范围(就像你的日期时间值一样)
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上使用索引
编辑,您只需指定所需的数字
答案 1 :(得分:2)
对于前导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”。
答案 2 :(得分:1)
不要将字节数组用作字符串,请像数字一样使用它。
您需要做的就是:
SELECT * FROM T_TRANSACTION WHERE Indicium> = 0x0001
或者如果您想获得一个具体的:
选择*从T_TRANSACTION WHERE标记> = 0x0001DC780C0030373156635D0C00B8840301009A0600AC