0

由于第 3 方在 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.ColumnA则返回0 else 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 回答