6

SQL Serverでは、列で複数の値を検索する必要がありますが、正確な値がわからないため、ワイルドカードも使用する必要があります。

私の現在のクエリは次のようになります。

SELECT * 
FROM table 
WHERE fieldname in ( '%abc1234%',
                     '%cde456%',
                     '%efg8976%')

これは結果を返しませんが、1つの個別の値を検索すると、それが見つかるので、それらがそこにあることがわかります。数百の値では少し扱いに​​くい複数のORを実行する以外に、これを実行する方法はありますか?

また、%が機能しない同じクエリが問題なく機能するため、このクエリが機能しない理由を知りたいと思います(完全に一致するものをいくつかキャッチするだけの小さな問題を除く)。

4

3 に答える 3

16

Fulltext Indexの使用を見てください。これにより、検索がはるかにうまく機能し、「OR」の問題が起動しやすくなります。

SELECT * 
FROM table 
WHERE CONTAINS(fieldname, '"abc1234" OR "cde456" OR "efg8976"')

以下も参照してください。

http://www.simple-talk.com/sql/learn-sql-server/full-text-indexing-workbench/

于 2012-05-25T03:13:01.547 に答える
4

クエリが機能しない理由はfieldname、括弧内の値のリスト内で完全一致を探すためです。LIKEワイルドカードを考慮した比較は行いません。

したがって、クエリは次と同等です。

SELECT *  from table  
where  fieldname  = '%abc1234%' OR
       fieldname  = '%cde456%' OR        
       fieldname  = '%efg8976%' 

明らかにあなたが望むものではありません。

于 2012-05-25T03:13:35.430 に答える
3
select table.* from (
    table join
    ( select * from values (
        ( '%abc1234%' ), ( '%cde456%' ), ( '%efg8976%' )
    ) ) as search( exp ) on 0 = 0
) where fieldname like exp

多分

select table.* from
    table join
    ( select * from values (
        ( '%abc1234%' ), ( '%cde456%' ), ( '%efg8976%' )
    ) ) as search( exp )
 on fieldname like exp

確かにいくつかの構文をモジュロします。

ポイントは、値のリストを唯一のパラメーターにできるようにすることです。

于 2012-05-25T03:24:05.830 に答える