2

ケースステートメントで部分文字列関数を使用して、「B0」から「B9」までのすべての数値を返しています。

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-9]'

しかし、私はこのリストの番号「B5」を返したくありません。私はそれをこのように動かすことができます

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-4]'
WHEN SUBSTRING (postcode, 1, 2) like 'B[6-9]'

しかし、これを次のように1行に追加する方法はありますか?

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-9]' and not like 'B5'

編集:

0〜100の数値を処理する場合、SQLは次のようになります。

WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]'

しかし、16と17を含めたくありませんでしたか?

4

4 に答える 4

7
WHEN SUBSTRING (postcode, 1, 2) like 'B[012346789]' -- No "5"

LIKEパターンは素晴らしいです。必要に応じて、ミニ正規表現。

joinこれを数値の10桁以上で実行するには、これらの値を、、existsまたはに使用できるテーブルに入れることを検討することをお勧めしますin

または、この列の数値部分を文字列ではなく数値であるかのように扱っているため、これは2つの列として格納された方がよいことを示しています。1つはアルファ用、もう1つは数値用です。

スキーマに変更を加えない限り、英字をアドホックに削除して、次のように数値の範囲と比較できるようにすることができます。

where cast(replace(postcode, 'B', '') as int) between 0 and 15
    or cast(replace(postcode, 'B', '') as int) between 18 and 100

where cast(right(postcode, len(postcode) - 1) as int) between 0 and 15
    or cast(right(postcode, len(postcode) - 1) as int) between 18 and 100

これらはほんの2、3の可能性です。あなたはあなたのデータをマッサージする方法を最もよく知っているでしょう。

于 2013-01-31T14:21:23.033 に答える
3

2つの範囲を試して、そこから5つを削除することができます。

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-46-9]'
于 2013-01-31T14:21:52.930 に答える
1

^Notを表すために使用します。Like ...を参照してください。

でもやってみませんか

`WHEN SUBSTRING (postcode, 1, 2) like 'B[0-4]' Or   
      SUBSTRING (postcode, 1, 2) like 'B[6-9]'`

または、同じ括弧内に範囲を入れることができます

`WHEN SUBSTRING (postcode, 1, 2) like 'B[0-46-9]'
于 2013-01-31T14:25:13.033 に答える
0

1桁の場合(元の質問)には、すでにたくさんのすばらしい回答があります。ただし、実際の正規表現がないと、複数桁の問題を解決することはできません。

除外したい値のリストがあることがわかります。その場合、これを使用できます:

WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]'
 AND SUBSTRING (postcode, 1, 3) NOT IN ('B16', 'B17')

「除外対象」のリストがテーブルにある場合は、NOT EXISTS代わりに次を使用してください。

WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]'
 AND NOT EXISTS(SELECT 1 FROM dbo.excludables AS ex WHERE ex.val = SUBSTRING (postcode, 1, 3))
于 2013-01-31T14:39:04.780 に答える