В постоянном поле, как вы возвращаете количество вхождений столбца в столбце другой таблицы
Требуется следующее из-за записей, вводимых третьими лицами в веб-приложении.
Некоторые столбцы (такие как Category
) требует проверки, в том числе ниже. У меня есть стол OtherTable
с допустимыми значениями.
Мне нужно определить, сколько вхождений (т. Е. IF) есть значения столбца текущей таблицы в указанном столбце другой таблицы. Если вхождений нет, это приводит к помеченной ошибке "1", при наличии вхождений это не приводит к помеченной ошибке "0".
If `Category` can be found in `OtherTable.ColumnA` then return 0 else 1
Как я могу сделать это, пожалуйста?
2 ответа
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
Если
Category
можно найти вOtherTable.ColumnA
затем верните 0 или 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-скрипка: http://sqlfiddle.com/
Изменить: я только что заметил, что вы хотите использовать вычисляемый столбец. Как я уже читал, вы можете использовать его только со скалярными значениями, а не с подзапросами. Но вы можете создать скалярную функцию.
Например:
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/
Примечание: как @Damien_The_Unbelieve прокомментировал в другом ответе, даже если вы сохраните результат с UDF, значение не будет обновлено, если строки в OtherTable изменятся. Просто имейте это в виду, поэтому вам нужно обновить таблицу вручную, если это необходимо, с помощью UDF.