サーチ…
構文
%付きのワイルドカード: 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 '_%';