3

指定したバイト シーケンスを含む varbinary(max) 列を返す SQL Server 2012 でクエリを作成しようとしています。varbinary フィールドを varchar に変換し、LIKE を使用するクエリでそれを行うことができます。

SELECT * FROM foo
WHERE CONVERT(varchar(max), myvarbincolumn) LIKE 
  '%' + CONVERT(varchar(max), 0x626C6168) + '%'

ここで、「0x626C6168」はターゲット バイト シーケンスです。残念ながら、これは、フィールドに値ゼロ (0x00) のバイトが含まれていない場合にのみ機能し、それらは私のデータでは非常に一般的です。ゼロ値のバイトを含む値で機能する別のアプローチはありますか?

4

3 に答える 3

2

バイナリ照合を使用すると、機能するはずです。

WITH foo(myvarbincolumn) AS
(
SELECT 0x00626C616800
)
SELECT *
FROM   foo
WHERE  CONVERT(VARCHAR(max), myvarbincolumn) COLLATE Latin1_General_100_BIN2 
                    LIKE '%' + CONVERT(VARCHAR(max), 0x626C6168) + '%' 

Latin1_General_BIN古いバージョンの SQL Server の場合は、(たとえば) 必要になる場合があります。

于 2013-10-31T14:38:03.240 に答える
2

残念ながら、Martin が提案したソリューションには欠陥があります。

検索キーのバイナリ シーケンスに任意の0x25バイトが含まれている場合は、( ASCIIテーブル%に従って) 文字に変換されます。

この文字は句内のワイルドカードとして解釈され、like多くの望ましくない結果が表示されます。

-- A table with a binary column:
DECLARE @foo TABLE(BinCol VARBINARY(MAX));
INSERT INTO @foo (BinCol) VALUES (0x001125), (0x000011), (0x001100), (0x110000);

-- The search key:
DECLARE @key VARBINARY(MAX) = 0x1125; -- 0x25 is '%' in the ASCII table!

-- This returns ALL values from the table, because of the wildcard in the search key:
SELECT * FROM @foo WHERE
    CONVERT(VARCHAR(max), BinCol) COLLATE Latin1_General_100_BIN2
    LIKE ('%' + CONVERT(VARCHAR(max), @key) + '%');

この問題を解決するには、以下の検索句を使用します。

-- This returns just the correct value -> 0x001125
SELECT * FROM @foo WHERE 
    CHARINDEX
    (
        CONVERT(VARCHAR(max), @key),
        CONVERT(VARCHAR(max), BinCol) COLLATE Latin1_General_100_BIN2
    ) > 0;
于 2018-04-18T17:19:56.950 に答える