由于第 3 方在 Web 应用程序中输入了记录,因此需要以下内容。
某些列(例如Category
)需要验证,包括以下列。我有一个OtherTable
包含允许值的表。
我需要确定当前表的列值在不同表的指定列中有多少次出现(即:IF)。如果没有发生,则导致标记错误“1”,如果发生,则不会导致标记错误“0”。
If `Category` can be found in `OtherTable.ColumnA` then return 0 else 1
请问我该怎么做?
由于第 3 方在 Web 应用程序中输入了记录,因此需要以下内容。
某些列(例如Category
)需要验证,包括以下列。我有一个OtherTable
包含允许值的表。
我需要确定当前表的列值在不同表的指定列中有多少次出现(即:IF)。如果没有发生,则导致标记错误“1”,如果发生,则不会导致标记错误“0”。
If `Category` can be found in `OtherTable.ColumnA` then return 0 else 1
请问我该怎么做?
如果
Category
可以找到OtherTable.ColumnA
则返回0 else 1
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 的帮助下手动更新表。
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