SQLワイルドカード範囲に基づいて属性で選択


8

文字列が文字で始まるジオデータベーステーブルからすべてのレコードを選択したいので、試してみました

SELECT *
FROM tbl_names
WHERE "name" LIKE '[A-Z]%'

これはレコードを返しませんでした。いくつか検索したところ、これはSQL Serverの構文であることがわかりました。SQLサポートのすべてのバージョンを知っている限り、これが問題になるとは思いませんでした%クエリ式の作成に関するヘルプファイルを確認した後、正しい構文が

SELECT *
FROM tbl_names
WHERE "name" >= 'A'

名前はすべて文字列なので、最初の本能はを試すことLIKEでした。>=代わりに演算子が使用されるのはなぜLIKEですか?ArcMapではワイルドカード範囲はサポートされていませんか?


このデータベースはわかりませんが、数字を並べ替えるのはどちらの側ですか。つまり、ない0の後に来るZ(通常は、私は思う)、または前にA?他の多くのDBMSはこの種の機能をサポートしていません。そのため、わずかに異なるものの知識を使用する必要があります。また、小文字(またはすべて大文字)についてはどうですか?また、英語以外の文字(AZ以外)はどうですか?
時計じかけのミューズ

フィールドを昇順で並べ替えると、文字列は次のように表示されます!z,?,0,0a,1,10,2,ant,A,Ant,z,Z。つまり、特殊文字、数字、(大文字と小文字が区別される)文字です。
Cindy

回答:


9

ワイルドカードは一般にArcMapでサポートされています。以下は、「属性による選択」を行っているときに得られるヘルプからの抜粋です。


(=演算子の代わりに)LIKE演算子を使用して、部分的な文字列検索を作成します。たとえば、次の式は米国の州名の中からミシシッピ州とミズーリ州を選択します。

"STATE_NAME" LIKE 'Miss%'

より大きい(>)、より小さい(<)、以上(> =)、以下(<=)、およびBETWEEN演算子を使用して、ソート順に基づいて文字列値を選択できます。たとえば、次の式は、MからZの文字で始まる名前のカバレッジ内のすべての都市を選択します。

"CITY_NAME" >= 'M' 等しくない(<>)演算子は、文字列をクエリするときにも使用できます。

ワイルドカード文字ワイルドカード文字は、1つ以上の文字を表す特別な記号です。

ファイルベースのデータの場合、「%」はその場所で何でも受け入れられることを意味します。1文字、100文字、または文字なし。または、1文字を表すワイルドカードを使用して検索する場合は、「_」を使用します。

たとえば、次の式は、Cathy、Catherine、Catherine Smithなど、Cathという文字で始まる名前を選択します。

"NAME" LIKE 'Cath%'

しかし、この式では、キャサリンスミスとキャサリンスミスが見つかります。

"OWNER_NAME" LIKE '_atherine smith' パーソナルジオデータベースのクエリに使用するワイルドカードは、任意の数の文字を表す「*」と「?」です。1文字。

ワイルドカード文字は、クエリダイアログのボタンとして表示されます。ボタンをクリックして、作成中の式にワイルドカードを入力できます。クエリ対象のレイヤーまたはテーブルのデータソースに適したワイルドカード文字のみが表示されます。

=演算子を使用して文字列でワ​​イルドカード文字を使用する場合、文字はワイルドカードとしてではなく、文字列の一部として扱われます。

結合テーブルでは、クエリする結合の側に適したワイルドカードを使用します。クエリがターゲットテーブル(左側のテーブル)のフィールドにのみ適用される場合は、ターゲットテーブルのワイルドカードを使用します。クエリが結合テーブル(右側のテーブル)のフィールドにのみ適用される場合は、結合テーブルのワイルドカードを使用します。クエリに結合の両側のフィールドが含まれる場合は、「%」および「_」ワイルドカードを使用します。

たとえば、dbfファイル(結合テーブル)を個人のGDBフィーチャクラス(ターゲットテーブル)に結合する場合:

  1. 個人のGDBフィールドのみを含むクエリには*を使用します。

  2. %は、dbf列のみを含むクエリに使用します。

  3. テーブルの両側の列を含むクエリには%を使用します。


これによると、範囲はサポートされていないと思います。代わりに、>と<を使用する必要があります。


私がサブストリングを選択するためにほとんどの時間を使用していた方法はだったので、ワイルドカードを使用できることを理解していますWHERE "name" LIKE '%substring%'[0-9][0-9][A-Z]%ワイルドカード範囲を受け入れないことに気付いたのは、正規表現のような特定の形式の文字列を探す必要があったときだけでした。
Cindy Jayakumar

@Torsten、ありがとう!個人のGDBでは、ワイルドカードに*ではなく%を使用することを知りませんでした。
輝く

1

はい、LIKEステートメントでワイルドカードを使用できます。ArcMapで範囲を使用したことはありませんが、SQL Serverの観点から正しい構文を使用しています。

ただし、「> =」演算子を使用する場合の簡単な警告です。これの結果は、設定されている照合順序によって異なります。これにより、データでの並べ替えの実行方法(大文字と小文字が区別されるかどうかなど)が変更される可能性があります。したがって、場合によっては、クエリが大文字で始まる値のみを返し、場合によっては大文字と小文字の両方を返すことがあります。

http://sqlblog.com/blogs/louis_davidson/archive/2007/05/20/sorting-and-case-sensitive-collat​​ions.aspxを参照してください

また、フィールドの最初の文字だけに興味がある場合は、

WHERE SUBSTRING("name", 1, 1) >= 'A'

のではなく

WHERE "name" >= 'A'

他に何もない場合、これにはパフォーマンス上の利点があるかもしれません。


実際には、いいえ。このSUBSTRINGメソッドは、(通常)のインデックスnameが無視されることを意味するため、パフォーマンスを向上させることはほとんどありません。はい、あなたはあり、私が個人的にオプティマイザが実現するために書かれている疑い...私はとにかく比較される最初の文字の後に戻ってくるのを意識してい比較のために高いコスト(指定された文字の長さ)が、ほとんどの実装を持っているSUBSTRING(column, 1, 1)だけで、スタートを返しています文字列の
Clockwork-Muse

を使用して大文字と小文字の区別を回避できupperますか?私はこの演習のケースについては心配していませんが、覚えておくとよいでしょう。
Cindy Jayakumar

はい、あなたは完全に正しいです。この場合、SUBSTRINGを使用してもパフォーマンスが向上する可能性は低く、逆の影響が生じる可能性があります。
pecoanddeco
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.