6

(Microsoft) Sql Server 2008 テーブルに制約を作成しています。データ型が異なる 2 つの列があります。常に 1 つの列が null である必要がありますが、両方であってはなりません (論理排他的 OR/XOR)。私は現在、作業式を持っています。

(@a is null or @b is null) and not (@a is null and @b is null)

私の質問は、このコードを書くためのよりクリーンで短い方法はありますか?

それをテストするには、このコードを使用できます...

declare @a int
declare @b varchar(5)

set @a=1
set @b='XXXXX'

if (@a is null or @b is null) and not (@a is null and @b is null)
  select 'pass'
else
  select 'fail'
4

2 に答える 2

5

を好む

if (@a is null and @b is not null) or (@a is not null and @b is null)

私の意見では、それは少し明確です

于 2012-12-05T20:16:29.223 に答える
3

わかりました、すべての文字列を操作している場合は、(ばかげていますが) 提案があります。また、特定の数の非 null が必要な場合は、2 より大きい倍数にスケーリングします。繰り返しますが、それはばかげていて、それほど短くはありませんが、言及するのを逃すにはあまりにも楽しかったです...

where LEN(ISNULL(right(@a+'x',1),'')+ISNULL(right(@b+'x',1),'')) = 1

あなたのものでそれを機能させるには、[int]をキャストする必要があると思います。マッチングの前に where 句で文字列の「手術」を行うのは悪であり、非常に遅くなりがちです。しかし、6 つの列があり、ちょうど 1 つが非 null である必要がある場合、このトリックはスケールアップします。

基本的に、非 null をカウントするために LEN を使用しています。は、aを null として+'x'カウントしないことを保証します。''[char] 列をテストするときは、それをオフにしておくことができます。

于 2012-12-05T20:49:51.930 に答える