サーチ…


構文

  • %付きのワイルドカード: SELECT * FROM [table] WHERE [column_name] '%Value%'のように

    _のワイルドカード: SELECT * FROM [テーブル] WHERE [列名] 'V_n%'のように

    [charlist]を使用したワイルドカード: SELECT * FROM [table] WHERE [column_name] 'V [abc] n%

備考

WHERE句のLIKE条件は、指定されたパターンに一致する列の値を検索するために使用されます。パターンは、以下の2つのワイルドカード文字を使用して形成されます

  • %(Percentage Symbol) - ゼロ個以上の文字を表すために使用されます。
  • _(アンダースコア) - 単一の文字を表すために使用されます

オープンエンドパターンにマッチ

文字列の先頭または末尾(またはその両方)に%ワイルドカードを追加すると、パターンの先頭または末尾の0文字以上の文字を一致させることができます。

中央の '%'を使用すると、パターンの2つの部分の間に0文字以上の文字が一致することができます。

このEmployeesテーブルを使用します:

イド FName LName 電話番号マネージャーID DepartmentId 給料 Hire_date
1 ジョンジョンソン 2468101214 1 1 400 23-03-2005
2 ソフィーアムゼン 2479100211 1 1 400 11-01-2010
3 ロニースミス 2462544026 2 1 600 06-08-2015
4 ジョンサンチェス 2454124602 1 1 400 23-03-2005
5 ヒルデ Knag 2468021911 2 1 800 01-01-2000

次のステートメントは、Employeesテーブルから文字列 'on' を含む FName 持つすべてのレコードを照合します。

SELECT * FROM Employees WHERE FName LIKE '%on%';
イド FName LName 電話番号マネージャーID DepartmentId 給料 Hire_date
3 R on ny スミス 2462544026 2 1 600 06-08-2015
4 J on サンチェス 2454124602 1 1 400 23-03-2005

次のステートメントは、従業員から文字列 '246'で始まる PhoneNumberを持つすべてのレコードと一致ます。

SELECT * FROM Employees WHERE PhoneNumber LIKE '246%';
イド FName LName 電話番号マネージャーID DepartmentId 給料 Hire_date
1 ジョンジョンソン 246 8101214 1 1 400 23-03-2005
3 ロニースミス 246 2544026 2 1 600 06-08-2015
5 ヒルデ Knag 246 8021911 2 1 800 01-01-2000

次のステートメントは、Employeesから文字列 '11'で終わる PhoneNumberを持つすべてのレコードと一致ます。

SELECT * FROM Employees WHERE PhoneNumber LIKE '%11'
イド FName LName 電話番号マネージャーID DepartmentId 給料 Hire_date
2 ソフィーアムゼン 24791002 11 1 1 400 11-01-2010
5 ヒルデ Knag 24680219 11 2 1 800 01-01-2000

Fnameの第3文字が従業員から 'n'であるすべてのレコード。

SELECT * FROM Employees WHERE FName LIKE '__n%';

(最初の2文字をスキップするには、「n」の前に2つのアンダースコアが使用されます)

イド FName LName 電話番号マネージャーID DepartmentId 給料 Hire_date
3 ロニースミス 2462544026 2 1 600 06-08-2015
4 ジョンサンチェス 2454124602 1 1 400 23-03-2005

一文字のマッチ

構造化照会言語(SQL-SELECT)ステートメントの選択を広げるために、ワイルドカード文字、パーセント記号(%)およびアンダースコア(_)を使用することができます。

_ (アンダースコア)文字は、パターンマッチの任意の1文字に対してワイルドカードとして使用できます。

Fnameが 'j'で始まり、 'n'で終わり、Fnameに正確に3文字あるすべての従業員を探します。

SELECT * FROM Employees WHERE FName LIKE 'j_n'

_ (アンダースコア)文字は、パターンを一致させるためにワイルドカードとして複数回使用することもできます。

たとえば、このパターンは "jon"、 "jan"、 "jen"などと一致します。

jn、john、jordan、justin、jason、julian、jillian、joannなどの名前は表示されません。クエリでアンダースコアが1つ使用され、正確にスキップできます。 1文字なので、結果は3文字のFnameでなければなりません。

たとえば、このパターンは "LaSt"、 "LoSt"、 "HaLt"などと一致します。

SELECT * FROM Employees WHERE FName LIKE '_A_T'

範囲またはセットでマッチ

指定された範囲内の任意の1文字をマッチさせます(例: [af] )またはセットします(例: [abcdef] )。

この範囲パターンは "gary"にマッチしますが、 "mary"にはマッチしません:

SELECT * FROM Employees WHERE FName LIKE '[a-g]ary'

この設定パターンは "mary"に一致しますが、 "gary"には一致しません。

SELECT * FROM Employees WHERE Fname LIKE '[lmnop]ary'

範囲またはセットは、範囲またはセットの前に^キャレットを追加することで否定することもできます。

この範囲パターンは "gary"と一致しませんが、 "mary"と一致します:

SELECT * FROM Employees WHERE FName LIKE '[^a-g]ary'

この設定パターンは "mary"と一致しませんが、 "gary"と一致します:

SELECT * FROM Employees WHERE Fname LIKE '[^lmnop]ary'

ANY対ALLのマッチ

一致するもの:
少なくとも1つの文字列に一致する必要があります。この例では、商品タイプは 'electronics'、 'books'、または 'video'のいずれかでなければなりません。

SELECT *
FROM   purchase_table
WHERE  product_type LIKE ANY ('electronics', 'books', 'video');

すべて一致(すべての要件を満たしている必要があります)。
この例では、「英国」 「ロンドン」 「東路」(バリエーションを含む)の両方が一致しなければなりません。

SELECT *
FROM   customer_table
WHERE  full_address LIKE ALL ('%united kingdom%', '%london%', '%eastern road%');

否定的な選択:
ALLを使用してすべてのアイテムを除外します。
この例では、商品タイプが「エレクトロニクス」ではなく「書籍」ではなく「ビデオ」ではないすべての結果が得られます。

SELECT *
FROM   customer_table
WHERE  product_type NOT LIKE ALL ('electronics', 'books', 'video');

文字の範囲を検索する

次のステートメントは、 EmployeesテーブルからAからFまでの文字で始まるFNameを持つすべてのレコードと一致します。

SELECT * FROM Employees WHERE FName LIKE '[A-F]%'

LIKEクエリ内のESCAPEステートメント

LIKE -queryとしてテキスト検索を実装する場合、通常は次のようにします。

SELECT * 
FROM T_Whatever 
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') 

しかし、(フルテキスト検索を使用できるときにLIKE使用する必要はありませんが)50%や "a_b"のようなテキストを入力すると問題が発生します。

だから(フルテキスト検索に切り替える代わりに) LIKE -escapeステートメントを使ってその問題を解決することができます:

SELECT * 
FROM T_Whatever 
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') ESCAPE '\'

つまり、 \はESCAPE文字として扱われます。これは、検索する文字列のすべての文字に\を前置することができることを意味します。ユーザーが%または_ような特殊文字を入力した場合でも、結果は正しく始まります。

例えば

string stringToSearch = "abc_def 50%";
string newString = "";
foreach(char c in stringToSearch) 
     newString += @"\" + c;
 
sqlCmd.Parameters.Add("@in_SearchText", newString); 
// instead of sqlCmd.Parameters.Add("@in_SearchText", stringToSearch);

注:上記のアルゴリズムはデモンストレーションの目的のみです。 1つの書体が複数の文字からなる場合(utf-8)は機能しません。例: string stringToSearch = "Les Mise\u0301rables";あなたは、各文字ではなく、各書体ごとにこれを行う必要があります。アジア/東アジア/南アジア言語を扱う場合は、上記のアルゴリズムを使用しないでください。あるいは、適切なコードを始めるには、graphemeClusterごとに行うべきです。

C#のインタビューの質問であるReverseStringも参照してください。

ワイルドカード文字

ワイルドカード文字はSQL LIKE演算子とともに使用されます。 SQLワイルドカードは、テーブル内のデータを検索するために使用されます。

SQLのワイルドカードは、%、_、[charlist]、[^ charlist]

- 0個以上の文字の代用

   Eg:  //selects all customers with a City starting with "Lo"
        SELECT * FROM Customers
        WHERE City LIKE 'Lo%';

       //selects all customers with a City containing the pattern "es"
      SELECT * FROM Customers
       WHERE City LIKE '%es%';

_ - 1文字の代わり

Eg://selects all customers with a City starting with any character, followed by "erlin"
SELECT * FROM Customers
WHERE City LIKE '_erlin';

[charlist] - 一致する文字のセットと範囲

Eg://selects all customers with a City starting with "a", "d", or "l"
SELECT * FROM Customers
WHERE City LIKE '[adl]%';

//selects all customers with a City starting with "a", "d", or "l"
SELECT * FROM Customers
WHERE City LIKE '[a-c]%';

[^ charlist] - 角括弧内に指定されていない文字にのみ一致します

Eg://selects all customers with a City starting with a character that is not "a", "p", or "l"
SELECT * FROM Customers
WHERE City LIKE '[^apl]%';

or

SELECT * FROM Customers
WHERE City NOT LIKE '[apl]%' and city like '_%';


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow