1

この問題が SO の別のチケットで解決されている場合は、申し訳ありません...検索してきましたが、適切な解決策が見つからないようです...

テーブルを作成しています。列「債権者」は、最後の文字がダッシュである可能性があることを除いて、ずっと数値です。

これは、'1234-'、'92846293' などの例は有効であり、'12354-53'、'12345K' は無効であることを意味します。文字列の長さは固定されていません (varchar(50) であることを除いて)。

チェック制約の作成方法がわかりません。

助けてください!

4

3 に答える 3

2

あなたはあなたのDBMSを述べていませんでした。PostgreSQL の場合、これは次のようになります。

alter table foo 
  add constraint check_creditor check (creditor ~ '^([0-9]+)\-?$');

Oracle の場合、これは次のようになります。

alter table foo 
   add constraint check_creditor check (regexp_like(creditor, '^([0-9]+)\-?$'))

DBMS が正規表現をサポートしている場合は、DBMS の構文を使用してこれを確認する必要があります。ただし、正規表現自体'^([0-9]+)\-$'はおそらく同じです。

于 2012-04-24T13:36:26.387 に答える
1

返信ありがとうございます。

私は以前にオペレーターを'%[^0-9]%'知らなかったので、上の提案は私にとって素晴らしい目を見張るものでした。^

必要な制約の2つのバージョンを実行しました。「のみ」のAND、OR、部分文字列、およびisnumericを使用するもの。派手なインデックスや除外はありません。わぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ もう1つのバージョンは、AND、OR、部分文字列、およびinsmuricで構成されていましたが、提案された^操作が含まれていました。ずっと見栄えがします。

次に、最後に、3番目のソリューションを使用しました:-) DBにbool列、RequiresCreditorValidationを追加し、C#コードに正規表現を実装しました。

結果のチェックの恩恵を受けることを望んでいる他の人のために、ここにあります。「醜い」ものから始めて:

CHECK ((val NOT IN ('+','-') AND (ISNUMERIC(val) = 1) OR 
(ISNUMERIC(SUBSTRING(val, 1, DATALENGTH(val) -1))) = 1) AND 
((SUBSTRING(val, (DATALENGTH(val)),1) LIKE '[0-9]') OR 
(SUBSTRING(val, DATALENGTH(val),1) = '-')) AND 
(SUBSTRING(val, 1, 1) NOT IN ('+','-')) )

2つ目:

CHECK ( (SUBSTRING(val, 1, DATALENGTH(val) - 1) NOT LIKE '%[^0-9]%') AND 
(SUBSTRING(val, DATALENGTH(val),1) LIKE '%[0-9-]') AND (DATALENGTH(val) > 0) 
AND SUBSTRING(val, 1,1) NOT IN ('+','-') )

そして、正規表現:

var allButLast = kreditorId.Substring(0, kreditorId.Length - 1);
        if (Regex.Match(allButLast, "[^0-9]").Success)
            return false;
        if (!kreditorId.EndsWith("-"))
            if (Regex.Match(kreditorId, "[^0-9]").Success)
                return false;
        return true;

良い、資格のある、迅速な返信をありがとうございました。

于 2012-04-26T11:12:47.250 に答える
0

SQL サーバーの場合:

テスト 1: 最後の文字を除くすべての文字が数字です (または、数字以外の文字は存在しません):

CHECK ( SUBSTRING(Creditor, 1, LEN(Creditor) - 1) NOT LIKE '%[^0-9]%' )

テスト 2: 最後の文字が数字またはダッシュのいずれかである:

CHECK ( SUBSTRING(Creditor, LEN(Creditor), 1) LIKE '%[0-9-%]' )

上記はCreditor、空の文字列にすることはできないと想定しています。

CHECK ( LEN(Creditor) > 0 )

楽しみのために:

CHECK ( REVERSE(CAST(REVERSE(Creditor) + REPLICATE(0, 50) AS CHAR(50))) 
           LIKE REPLICATE('[0-9]', 49) + '[0-9-]' )
于 2012-04-24T13:59:03.213 に答える