2列のテーブルがあります
CREATE TABLE mytable
(
x int
y char(1)
)
xの値に関してyに制約を適用したいと思います。
たとえば、x = 5の場合、y ='a'にしたい、x = 12 y='b'の場合などです。SQL Server 2008で実行することは可能ですか?何かのようなもの
case when x = 5 then y='a' end
後者のステートメントは機能しないので、私はアナログを求めています。
2列のテーブルがあります
CREATE TABLE mytable
(
x int
y char(1)
)
xの値に関してyに制約を適用したいと思います。
たとえば、x = 5の場合、y ='a'にしたい、x = 12 y='b'の場合などです。SQL Server 2008で実行することは可能ですか?何かのようなもの
case when x = 5 then y='a' end
後者のステートメントは機能しないので、私はアナログを求めています。
CREATE TABLE mytable
(
x int not null,
y char(1) not null,
constraint CK_mytable_myrules CHECK (
1 = CASE
WHEN x=5 AND y='a' THEN 1
WHEN x=12 AND y='b' THEN 1
/* More rules here */
ELSE 0 END
)
CASE式は、常に値を返す必要があります。ブール値はSQLの一部ではありません。
または、一般的なルールが「これらのルールのいずれにも一致しない場合は、通過させる」の場合、ネストされたCASEまたは「フォールバック」ルール(私自身の、発明されたばかりの用語)の2つの選択肢があります。
ネストされたケース:
1 = CASE
WHEN x=5 THEN
CASE WHEN y='a' THEN 1
ELSE 0 END
WHEN x=12 THEN
CASE WHEN y='b' THEN 1
ELSE 0 END
/* More rules here */
ELSE 1 END
または他の方法:
1 = CASE
WHEN x=5 AND y='a' THEN 1
WHEN x=5 THEN 0
WHEN x=12 AND y='b' THEN 1
WHEN x=12 THEN 0
/* More rules here */
ELSE 1 END
式を次のように設定できます。
( x = 5 AND y = 'a' ) OR ( x = 12 AND y = 'b' )
必要に応じてルールを追加してください...
このSQLを使用してテーブルに制約を追加します。
ALTER TABLE dbo.myTable WITH NOCHECK
ADD CONSTRAINT CK_myTable
CHECK (( x = 5 AND y = 'a' ) OR ( x = 12 AND y = 'b' ));
その他の例については、このリファレンスを確認してください。
このような制約を設定することは可能です。Cf. リンクテキスト 適切なUDFを定義する必要があります。
ああ、他の可能性もあるようです。