0

第三者が Web アプリケーションに入力するレコードのため、以下が必要です。

特定の列 ( などCategory) は、以下の列を含む検証が必要です。OtherTable許可された値を含むテーブルがあります。

現在のテーブルの列の値が、別のテーブルの指定された列に何回出現するか (つまり、IF) を特定する必要があります。発生がない場合はフラグ付きエラー「1」になり、発生した場合はフラグなしエラー「0」になります。

If `Category` can be found in `OtherTable.ColumnA` then return 0 else 1

どうすればこれを行うことができますか?

4

2 に答える 2

2

Categoryで見つかった場合はOtherTable.ColumnA0を返し、そうでない場合は1を返します

CASEで使用できますEXISTS

SELECT CASE WHEN EXISTS(
   SELECT NULL 
   FROM AllowedValues av
   WHERE av.ColumnA = Category
) THEN 0 ELSE 1 END AS ErrorCode
, Category
FROM [Table] 

編集: これは sql-fiddle です: http://sqlfiddle.com/#!3/55a2e/1


編集:計算列を使用したいことに気付きました。私が読んだように、サブクエリではなく、スカラー値でのみ使用できます。ただし、スカラー値関数を作成できます。

例えば:

create table AllowedValues(ColumnA varchar(1));
insert into  AllowedValues Values('A');
insert into  AllowedValues Values('B');
insert into  AllowedValues Values('C');

create table [Table](Category varchar(1));
insert into  [Table]  Values('A');
insert into  [Table]  Values('B');
insert into  [Table]  Values('C');
insert into  [Table]  Values('D');
insert into  [Table]  Values('E');

-- create a scalar valued function to return your error-code
CREATE FUNCTION udf_Category_ErrorCode
(
    @category VARCHAR(1)
)
RETURNS INT

AS BEGIN
    DECLARE @retValue INT

    SELECT @retValue = 
      CASE WHEN EXISTS(
       SELECT NULL 
       FROM AllowedValues av
       WHERE av.ColumnA = @category
    ) THEN 0 ELSE 1 END

    RETURN @retValue
END
GO

これで、関数を使用して値を計算する計算列として列を追加できます。

ALTER TABLE [Table] ADD ErrorCode AS ( dbo.udf_Category_ErrorCode(Category) )
GO

実行中の SQL は次のとおりです: http://sqlfiddle.com/#!3/fc49e/2

: @Damien_The_Unbelieve が他の回答でコメントしたように、UDF で結果を永続化しても、OtherTable の行が変更された場合、値は更新されませ。必要に応じて、UDF を使用してテーブルを手動で更新する必要があります。

于 2012-07-03T11:14:17.473 に答える
1
select mt.*,IFNULL(cat_count.ct,0) as Occurrences from MainTable mt 
left outer join (select ColumnA,count(*) as ct from OtherTable) cat_count 
on mt.Category=cat_count.ColumnA

結果:

mt.col1 | mt.col2 | Category | Occurrences 
###     | ###     | XXX      | 3
###     | ###     | YYY      | 0
###     | ###     | ZZZ      | 1     
于 2012-07-03T11:34:08.140 に答える