文字範囲に基づいて文字列フィールドを選択する最良の方法は何ですか?
-
02-07-2019 - |
質問
ソフトウェアのユーザーが文字範囲によってレコードを選択できる機能を追加する必要があります。
たとえば、名前が Ba-Bi の範囲に含まれるテーブルからすべてのウィジェットを返すクエリを作成するにはどうすればよいでしょうか?
現在、大なり演算子と小なり演算子を使用しているため、上記の例は次のようになります。
select * from widget
where name >= 'ba' and name < 'bj'
「bike」が省略されないように、上限の最後の文字を i から j まで「インクリメント」していることに注目してください。
フィールドの照合順序に基づいて、指定された文字の後の次の文字を検索する一般的な方法はありますか、それとも 2 番目の条件を作成した方が安全ですか?
select * from widget
where name >= 'ba'
and (name < 'bi' or name like 'bi%')
私のアプリケーションはローカリゼーションをサポートする必要があります。この種のクエリは、さまざまな文字セットに対してどの程度敏感ですか?
また、MSSQL と Oracle の両方をサポートする必要もあります。データにどのような言語が含まれているかに関係なく、大文字と小文字が区別されないようにするためのオプションは何ですか?
解決
ローカリゼーションに直接進みましょう。「あ」>=「ば」と言いますか?おそらくそうではありませんが、スウェーデンではそれが特徴です。また、どの言語でも大文字と小文字を無視できると考えることはできません。大文字と小文字は明らかに言語に依存しており、最も一般的な例はトルコ語です。大文字の i は İ です。小文字の I は ı です。
これで、SQL DB は、<、== などの結果を「照合順序」によって定義します。これは間違いなく言語固有です。したがって、クエリごとにこれを明示的に制御する必要があります。トルコ語の照合順序では、それらの i が属する場所 (トルコ語) に配置されます。デフォルトの照合順序に依存することはできません。
「増加部分」については、気にしないでください。>= と <= にこだわってください。
他のヒント
MSSQLについては、次のスレッドを参照してください: http://bytes.com/forum/thread483570.html。
Oracleの場合、Oracle 10はクエリのようなregex(p)をサポートするようになったため、Oracleのバージョンに依存します。 http://www.psoug.org/reference/regexp.html (regexp_likeを検索)および次の記事を参照してください: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html
HTH
不満なことに、Oracleのサブストリング関数はSUBSTR()ですが、SQL-Serverの場合はSUBSTRING()です。
1つまたは両方の単純なラッパーを記述して、同じ関数名+プロトタイプを共有することができます。
その後、使用できます
MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'
または類似。
これを使用できます...
select * from widget
where name Like 'b[a-i]%'
これは、名前がbで始まり、2番目の文字がa〜iの範囲にあり、その他の文字が続くすべての行に一致します。
上限の最後に高ソート文字列を追加するような単純な方法で行くと思います。次のようなもの:
select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'
それがEBCDIC変換を生き残るかどうかはわかりません
次のようにすることもできます:
select * from widget
where left(name, 2) between 'ba' and 'bi'
条件の長さが変更された場合(残したコメントで示しているように思われる場合)、クエリには入力としての長さも必要です:
declare @CriteriaLength int
set @CriteriaLength = 4
select * from widget
where left(name, @CriteriaLength) between 'baaa' and 'bike'