私も今日ページを書いているときに、テーブルにレコードがあったのに、ASP でレコードが見つからず、アクセスと SQL のクエリ ステートメントのワイルドカード文字が違うことが原因であることがわかり、とても落ち込んでいました。 。
ACCESS のワイルドカード文字と SQL SERVER のワイルドカード文字の比較
================================================= =
ACCESS ライブラリのワイルドカード文字は次のとおりです。
*任意の数の文字に一致します
? 任意の 1 文字と一致します。
SQL Server のワイルドカード文字は次のとおりです。
% は任意の数の文字に一致します
_ は単一の文字に一致します
文章
今日ページを書いていたとき、私もとても落ち込んでいました。テーブルにはレコードがありましたが、ASP でそれらを見つけることができませんでした。理論的な SQL ステートメントは次のとおりです。
Select * FROM t_food Where t_food.name like '*apple*'
GOOGLEで検索すると、ASPのあいまいクエリは次のように記述する必要があることがわかりました。
Select * FROM t_food Where t_food.name like '%%apple%%'
% である必要があり、2 つある必要があります。ご注意ください。
++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++
SQL クエリ ステートメントのワイルドカードの問題
SQL ステートメントを使用して Access でデータをクエリする場合、クエリにはワイルドカード文字 * が使用されます。声明は次のとおりです。
通常の書籍名から * を選択 (「*h*」のような)
Access の SQL ビューで試してみましたが、問題なく動作しました。そこでC#プログラムにSQL文を書き込んだのですが、クエリ文に到達した時点でエラーが発生してしまい戸惑いました。そこで、Access のヘルプ ファイルを探したところ、次のヘルプが見つかりました。
//////////////////////////////////////////////// /// //////////
文字列式を SQL 式のパターンと比較します。
文法
パターンのような表現
Like 演算子の構文は次の部分で構成されます。
部分的な説明
式 Where 句で使用される SQL 式。
文字列リテラル パターンが式と比較されます。
説明する
Like 演算子を使用して、指定したパターンに一致するフィールド値を検索できます。パターンには、完全な値 (たとえば、Like Smith) を指定することも、ワイルドカードを使用して値の範囲を検索することもできます (たとえば、Like Sm*)。
式では、Like 演算子を使用してフィールド値を文字列と比較できます。たとえば、SQL クエリに「Like C*」と入力すると、クエリは文字 C で始まるすべてのフィールド値を返します。パラメーター クエリでは、検索するパターンを入力するようにユーザーに求めることができます。
次の例は、文字 P で始まり、その後に A ~ F の任意の文字と 3 つの数字が続くデータを返します。
P[AF]### のように
次の表は、Like を通じてさまざまなパターンの式をテストする方法を示しています。
マッチタイプ
パターンマッチング
(Trueを返す) 一致しません
(偽を返す)
複数の文字 a*a aa、aBa、aBBBa aBC
*ab* abc、AABB、Xab aZb、bac
特殊文字 a
ああ*ああああ
複数の文字 ab* abcdefg、abc cab、aab
単一文字 a?a aaa、a3a、aBa aBBBa
単一の数字 a#a a0a、a1a、a2a aaa、a10a
文字範囲 [az] f、p、j 2、&
範囲外 [!az] 9、&、% b、a
数値以外の値[!0-9] A、a、&、~0、1、9
複合値 a[!bm]# An9、az0、a99 abc、aj0
参照アドレス: http://office.microsoft.com/zh-cn/assistance/HP010322532052.aspx
//////////////////////////////////////////////// /// /////////
ヘルプにはこのように書いてありますが、問題はありません。それは私をさらに混乱させます。後で同僚に尋ねたところ、「あなたの SQL ステートメントは間違っています。ワイルドカード文字は * ではなく % であるべきです。」とのことです。しかし、ヘルプには * と書かれており、Access でテストするとすべて正常に動作します。同僚はその理由を説明できず、ヘルプ リクエストに対する答えを探し続けています。次の情報が別のヘルプ ファイルにありました。
//////////////////////////////////////////////// /// /////////
組み込みのパターン マッチング メソッドは、文字列比較のための一般的なツールを提供します。次の表は、Like 演算子で使用できるワイルドカード文字と、それらに一致する数値および文字列を示しています。
パターン内の文字 式内の一致
? または _ (アンダースコア) 任意の 1 文字
* または % 0 個以上の文字
# 任意の単一の数字 (0 ~ 9)
[charlist] charlist 内の任意の 1 文字。
[!charlist] charlist にない任意の 1 文字。
大括弧 ([]) で囲まれた 1 つ以上の文字のセット (charlist) を使用して、式内の任意の 1 文字と一致させることができます。charlist には、数字を含む ANSI 文字セットのほとんどの文字を含めることができます。左括弧 ([)、疑問符 (?)、数字記号 (#)、アスタリスク (*) などの特定の文字を角括弧で囲むことにより、記号自体と直接照合できます。右括弧をグループ内で使用してそれ自体と一致させることはできませんが、グループ外では単一の文字として使用できます。
角括弧で囲まれた単純な文字リストに加えて、文字リストにはハイフン (-) を使用して区切られた範囲の上限と下限を含めることができます。たとえば、パターンで [AZ] を使用する場合、expression 内の対応する文字に A ~ Z の範囲の大文字が含まれている場合に一致します。範囲を区切らずに、複数の範囲を角括弧で囲むことができます。たとえば、[a-zA-Z0-9] は任意の英数字に一致します。
ANSI SQL ワイルドカード文字 (%) および (_) は、Microsoft® Jet 4.X バージョンおよび Microsoft OLE DB Provider for Jet でのみ有効であることに注意してください。 Microsoft Access または DAO で使用される場合、テキストとして扱われます。
パターン マッチングに関するその他の重要なルールは次のとおりです。
文字リストの先頭に感嘆符 (!) を使用すると、文字リスト外の文字が式に出現する場合に一致が発生することを示します。角括弧の外側で使用すると、感嘆符自体が一致します。
ハイフン (-) は、文字リスト自体と一致させるために、文字リストの先頭 (感嘆符の後) または末尾で使用できます。他の位置では、ハイフンは ANSI 文字の範囲を識別します。
文字範囲を指定する場合、文字は昇順 (A ~ Z または 0 ~ 100) で表示される必要があります。 [AZ]は有効なモード、[ZA]は無効なモードです。
文字順序 [ ] は無視され、長さ 0 の文字 ( ) として扱われます。
参照アドレス: http://office.microsoft.com/zh-cn/assistance/HP010322842052.aspx
//////////////////////////////////////////////// /// //////////////
この時点で、ようやく原因がわかりました。Access ではワイルドカード * を使用しているため、すべて正常に動作しますが、これを % に変更すると、正常に動作しません。 C# では、% ワイルドカードのみがサポートされており、これを * に置き換えるとエラーが発生します。この問題は互換性の問題とみなされますか?
ワイルドカード:
ワイルドカードの記述例
% 0 個以上の文字を含む任意の文字列。 WHERE title LIKE '%computer%' と指定すると、タイトルのどこかに「computer」という単語が含まれる書籍のタイトルがすべて検索されます。
_ (アンダースコア) 任意の 1 文字。 WHERE au_fname LIKE '_ean' は、ean で終わるすべての 4 文字の名前 (Dean、Sean など) を検索します。
[ ] 範囲 ([af]) またはセット ([abcdef]) 内の任意の 1 文字を指定します。ここで、au_lname LIKE '[CP]arsen' は、arsen で終わり、C と P の間の任意の 1 文字で始まる著者の姓 (例: Carsen、Larsen、Karsen など) を検索します。
[^] 指定された範囲 ([af]) またはセット ([abcdef]) に属さない任意の 1 文字。ここで、au_lname LIKE 'de[^l]%' は、de で始まり、後に l が続かないすべての著者の姓を検索します。
ワイルドカードをリテラルとして使用する
ワイルドカード文字を括弧で囲むことにより、ワイルドカード パターン マッチング文字列をリテラル文字列として使用できます。次の表は、LIKE キーワードと [ ] ワイルドカード文字の使用例を示しています。
記号の意味
「5[%]」のように 5%
「[_]n」_n のように
LIKE '[a-cdf]' a、b、c、d、または f
LIKE '[-acdf]' -、a、c、d、または f
のように '[ [ ]' [
のように ']' ]
LIKE 'abc[_]d%' abc_d と abc_de
LIKE 'abc[def]' abcd、abce、abcf
ESCAPE 句を使用したパターン マッチング
1 つ以上の特殊なワイルドカード文字を含む文字列を検索します。たとえば、顧客データベースの割引テーブルには、パーセント記号 (%) を使用して割引値が保存されている場合があります。パーセント記号をワイルドカード文字ではなく文字として検索するには、ESCAPE キーワードとエスケープ文字を指定する必要があります。たとえば、サンプル データベースには、30% のテキストを含む comment という名前の列が含まれています。コメント列内の任意の場所に文字列の 30% を含む行を検索するには、WHERE コメント LIKE '%30!%%' ESCAPE '!' で構成される Where 句を指定します。 ESCAPE とエスケープ文字を指定しない場合、SQL Server は文字列 30 を含むすべての行を返します。
次の例は、pubs データベースのタイトル テーブルの Notes 列で文字列 50% off when 100 or morecopies本を購入する場合を検索する方法を示しています。
タイトルからノートを選択してください。 ノートの例は「100 部以上購入すると 50%% オフ」です。 ESCAPE '%'