0

PolicyNoMySQL のテーブルに、次のような形式の列があります。

XXXX-000000

4 つの大文字の後にダッシュと 6 桁の数字続きます。

6 桁の数字はインクリメンタルで、次の行に加算1され、4 文字はすべての行で常に同じです。PolicyNo列は のタイプで一意ですvarchar(11)

注文すると、次のようになります。

XXXX-000001
XXXX-000002
XXXX-000003
...

PolicyNoここで、指定した数より大きい数のすべてを取得したいと考えています。

PolicyNo例: 次より大きいものをすべて取得します'XXXX-000100'

XXXX-000101
XXXX-000102
XXXX-000103
...

このクエリをテストしたところ、問題なく動作しましたが、本当に安全かどうかはわかりませんでした:

SELECT  'XXXX-000099' > 'XXXX-000098'
    ,   'XXXX-000099' > 'XXXX-000100'
    ,   'XXXX-000099' > 'XXXX-000101'

Result:
+-------------------------------+-------------------------------+-------------------------------+
| 'XXXX-000099' > 'XXXX-000098' | 'XXXX-000099' > 'XXXX-000100' | 'XXXX-000099' > 'XXXX-000101' |
+-------------------------------+-------------------------------+-------------------------------+
|                             1 |                             0 |                             0 |
+-------------------------------+-------------------------------+-------------------------------+

これを行う他の方法はありますか、それともすでにこれを使用しても問題ありませんか?

4

2 に答える 2

1

次のクエリのように、MySQL が提供する SUBSTRING 関数を使用することもできます。

SELECT count(*) FROM Table1 where substring(policyNo,6)>YOUR_RANGE;

ここでは、6 桁目から 6 桁の数字として 6 が渡されます。最初の 4 文字も渡したい場合は、次のクエリを使用できます。ここで 2 番目の where 句は、policyNo から最初の 4 文字を取得します。

SELECT count(*) FROM Table1 where substring(policyNo,6)>YOUR_RANGE AND substring(policyNo,1,4) = 'ABCD'

于 2012-11-08T03:04:39.603 に答える
1

4 文字のプレフィックスが同じで、常に同じ長さである限り、数値はゼロで埋められるため、MySQL が辞書式比較を行うため、これは機能するはずです。

パディングが1 つ少ない0と失敗することに注意してください。

SET @policy1 = 'XXXX-00099';
SET @policy2 = 'XXXX-000598';
SELECT @policy1, @policy2, @policy1 > @policy2 AS comparison;
=========================================
> 'XXXX-00099', 'XXXX-000598', 1

最後に数字を本当に比較する必要がある場合は、それらを解析してキャストする必要があります。

SET @policy1 = 'XXXX-00099';
SET @policy2 = 'XXXX-000598';
SELECT @policy1, @policy2, 
   CONVERT(SUBSTRING(@policy2, INSTR(@policy2, '-')+1), UNSIGNED) >
   CONVERT(SUBSTRING(@policy2, INSTR(@policy2, '-')+1), UNSIGNED) AS comparison;
=========================================
> 'XXXX-00099', 'XXXX-000598', 0
于 2012-11-08T03:04:59.823 に答える