由于第三方在Web应用程序中输入了记录,因此需要以下内容。
某些列(例如Category
)需要验证,包括下面的列。我有一个表OtherTable
,其中包含允许的值。
我需要确定当前表的列的值在不同表的指定列中出现的次数(即:IF)。如果没有出现,则会导致标记错误“1”,如果发生,则不会导致标记错误“0”。
If `Category` can be found in `OtherTable.ColumnA` then return 0 else 1
我该怎么办呢?
答案 0 :(得分:2)
一起使用如果
Category
中可以找到OtherTable.ColumnA
,则返回0其他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
修改:我刚才注意到你想要使用计算列。正如我所读,你只能使用标量值而不是子查询。但您可以创建scalar valued function。
例如:
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的帮助下手动更新表。
答案 1 :(得分: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