2009-12-02 9 views
10

同僚と冗談を言って、興味深いシナリオを思いつきました。SQL Serverでは「標準的な手段」(制約など)を通してテーブルを定義することは可能ですか? 2つ以上の列が相互排他的であることを確認してください。SQLサーバー:列を相互排他的に定義する

つまり、次のようになります。列のいずれかに値が含まれていることを確認できますか?

+0

あなたはどのような問題を解決しようとしていますか?非正規のデータベースはPITAで動作します。おそらく、リレーショナル・グッズを犠牲にしない方法で行うことができます。 –

+0

まあ、その考えの背後にある実際の問題はありません。私はそれが技術的に可能かどうかを知りたかっただけです。 1つのアイデアは、ユーザが自分の名前または会社名を入力することができますが、両方を入力する必要はないということがあります。私は熱心に思って、もっと良いものを思いつくかもしれませんね:-) –

答えて

14

はいあなたは、CHECK制約使用することができます多くの列が排他的であるならば、あなたはこのようにそれらを確認することができ、あなたのコメントパー

ALTER TABLE YourTable 
ADD CONSTRAINT ConstraintName CHECK (col1 is null or col2 is null) 

を:

case when col1 is null then 0 else 1 end + 
case when col2 is null then 0 else 1 end + 
case when col3 is null then 0 else 1 end + 
case when col4 is null then 0 else 1 end 
= 1 

これはの1つ言います4つの列に値が含まれている必要があります。それらがすべてNULLの場合は、<= 1をチェックしてください。

+0

ああ、私はこれがどこに行くのか分かります。ただし、3つ以上の列がある場合、チェックはもっと複雑になります。可能なすべての組み合わせを追加する必要があります。 –

+0

@Thorsten Dittmar:それは複数の列で少し複雑になる、私は可能なすべての組み合わせを追加せずにそれを行うことができると思う答えを編集 – Andomar

+0

こんにちは要件は上記と全く同じ状況に一致しているだけでなく、col1とcol2の両方が同時にヌルになるには、どちらか一方だけに必ず入力する必要があります。どうすればよいですか? – MaxRecursion

関連する問題