web-dev-qa-db-ja.com

文字列列を持つSQL Between句

文字列の列に対して「between」句を使用して検索したい。いくつかのテストをして私はこれを得ました:

タイプvarcharの「name」列を持つ国テーブルがあるとします。このクエリを実行すると:

Select * from country where name between 'a' and 'b'

私はこの結果を得ました:

Argentina
.
.
.
Argelia.

私が少し変だと思ったBで始まる国は除外します。

この検索をより正確な方法で行う方法はありますか?この検索を行うための他のアイデアはありますか?

前もって感謝します

18
Cheluis

表現

name between 'A' and 'B'

に相当

name>='A' and name<='B'

したがって、「アルゼンチン」は> = 'A'および<= 'B'であり、条件を満たす。ただし、「ボリビア」は<=「B」ではありません。 「ボリビア」>「B」。最初の文字だけを見るのではなく、文字列全体を調べます。確かにこれは本来あるべき姿です。もしこれが行われなかった場合、「スミス」は含まれているが「スミザーズ」は含まれていない範囲が必要であると言うことはできません。

あなたが望むものを達成するために、あなたは言うことができます:

substr(name,1,1) between 'A' and 'B'

または:

name like 'A%' or name like 'B%'

または:

name>='A' and name<'C'
36
Jay

私はあなたの問題を解決する方法を知っていると思います。あなたはこのように後ろに余分な文字を追加してみることができます

select * from tablea where column1 between 'ABC' and 'ACD'+'Z'

これはABC%からACEに結果を返します

2
Ariwibawa

結果は正確ですが、誤解されている可能性があります。 x between a and b 手段 x>=a and x<=b。 (詳細は PostGRESドキュメント を参照してください。)

aまたはbで始まる行を取得したい場合は、次のように言います。

select * from country where name like 'a%' or name like 'b%'

likeはテーブルインデックスを使用するので、これを使用すると完全なパフォーマンスが得られます。

1
Blindy

Aと同様にbで始まる国を取得する別のクエリは、次のようになります。

Select * from country where name between 'a' and 'c'
1
Daniel Corbett
Select * from country where substring(name FROM 1 FOR 1) between 'A' and 'B';
0
David Chan