Sql 当满足另一个表的条件时,如何从表中选择记录
我有一个定期运行的查询Sql 当满足另一个表的条件时,如何从表中选择记录,sql,sql-server,ssms,Sql,Sql Server,Ssms,我有一个定期运行的查询 SELECT REPLICATE('0', 10-LEN(PolicyNumber)) + PolicyNumber AS PolicyNumber, REPLICATE('0', 7-LEN(BOCBranch)) + BOCBranch AS BOCBranch, CIFNumber+ REPLICATE(' ', 8-LEN(CIFNumber)) AS CIFNumber, REPLICATE('0', 7-LEN(Emp
SELECT REPLICATE('0', 10-LEN(PolicyNumber)) + PolicyNumber AS PolicyNumber,
REPLICATE('0', 7-LEN(BOCBranch)) + BOCBranch AS BOCBranch,
CIFNumber+ REPLICATE(' ', 8-LEN(CIFNumber)) AS CIFNumber,
REPLICATE('0', 7-LEN(EmployeeNumber)) + EmployeeNumber AS EmployeeNumber,
PremiumSign,
REPLACE(REPLICATE('0',16-LEN(CAST(Premium AS VARCHAR))) + CAST(Premium AS VARCHAR),'.','') AS Premium,
CASE WHEN RegistrationDate IS NULL
THEN REPLICATE(' ', 8)
ELSE REPLACE(CONVERT(VARCHAR(10),RegistrationDate,103),'/','')
END AS RegistrationDate,
ActivityCode + REPLICATE(' ', 10-LEN(ActivityCode)) AS ActivityCode,
ActivityDescription + REPLICATE(' ', 255-LEN(ActivityDescription)) AS ActivityDescription,
PolicyTypeCode + REPLICATE(' ', 10-LEN(PolicyTypeCode)) AS PolicyTypeCode,
PolicyTypeDescription + REPLICATE(' ', 255-LEN(PolicyTypeDescription)) AS PolicyTypeDescription,
ContributionCode + REPLICATE(' ', 10-LEN(ContributionCode)) AS ContributionCode,
ContributionDescription + REPLICATE(' ', 255-LEN(ContributionDescription)) AS ContributionDescription,
ActivityMilimetra + REPLICATE(' ', 1-LEN(ActivityMilimetra)) AS ActivityMilimetra,
REPLICATE('0', 8-LEN(SourceCode)) + CAST(SourceCode AS varCHAR) AS SourceCode
FROM FileExtraction.EXTR_MILIMETRA
ORDER BY PolicyNumber
我已根据如下管理说明创建了一个名为FIELD_ACTIVATIONS的新表:
FieldName CategoryID IsActive
-------------------------------------------------- ----------- --------
PolicyNumber 1 1
BOCBranch 1 1
CIFNumber 1 1
EmployeeNumber 1 0
PremiumSign 1 0
RegistrationDate 1 0
ActivityCode 1 0
ActivityDescription 1 0
PolicyTypeCode 1 0
PolicyTypeDescription 1 0
ContributionCode 1 0
ContributionDescription 1 0
ActivityMilimetra 1 0
SourceCode 1 0
Premium 1 0
PolicyNumber 2 0
BOCBranch 2 0
CIFNumber 2 0
EmployeeNumber 2 1
PremiumSign 2 1
RegistrationDate 2 1
ActivityCode 2 0
ActivityDescription 2 0
PolicyTypeCode 2 0
PolicyTypeDescription 2 0
ContributionCode 2 0
ContributionDescription 2 0
ActivityMilimetra 2 0
SourceCode 2 0
Premium 2 0
PolicyNumber 3 0
BOCBranch 3 0
CIFNumber 3 0
EmployeeNumber 3 0
PremiumSign 3 0
RegistrationDate 3 0
ActivityCode 3 1
ActivityDescription 3 1
PolicyTypeCode 3 1
PolicyTypeDescription 3 0
ContributionCode 3 0
ContributionDescription 3 0
ActivityMilimetra 3 0
SourceCode 3 0
Premium 3 0
PolicyNumber 4 0
BOCBranch 4 0
CIFNumber 4 0
EmployeeNumber 4 0
PremiumSign 4 0
RegistrationDate 4 0
ActivityCode 4 0
ActivityDescription 4 0
PolicyTypeCode 4 0
PolicyTypeDescription 4 1
ContributionCode 4 1
ContributionDescription 4 1
ActivityMilimetra 4 1
SourceCode 4 1
Premium 4 1
您可能注意到,SELECT
语句中的每一列都是表中的字段名
我需要做的是,只对FieldName中出现的状态为IsActive=1的列运行SELECT
语句。对于SELECT
查询中状态为IsActive=0的列,我仍然希望选择该列,但将其显示为空列
这一切都不会永久删除或更改任何表中的任何内容
我尝试过使用案例、子查询、IFs,但我似乎无法想出一个解决方案,如果字段\u ACTIVATIONS表中的任何细节发生更改,那么该解决方案将不需要在将来进行更改
我也看过这个链接,但这个链接假定两个表中都有一个公共字段
在SELECT
查询中显示的名为“EXTR\u MILIMETRA”的主表除了列名和字段名之外,与字段激活没有任何共同之处
下面是“EXTR_MILIMETRA”中的列示例。(由于屏幕空间有限,并非所有列都显示。)下面显示的每一列都是一个字段名,如上表所示
问这个问题,我正冒着因为之前连续的反对票而被否决的风险。如果需要任何额外的信息,请先让我知道,而不是投反对票。如果可以的话。我真的尽力把我的问题描述得很好
很高兴作出澄清。@NikosV您需要的是一个动态查询。我将其命名为@DynamicQuery,一个分配您感兴趣的隐藏列的方法将向它们添加NULL,从而使它们的输出为空白。看看这个模型,只需将表名更改为要从中提取数据的表的实际名称,并使用您所创建的实际字段激活表
DECLARE @FIELD_ACTIVATIONS TABLE (FieldName varchar(200), CategoryID int, IsActive bit)
INSERT INTO @FIELD_ACTIVATIONS
SELECT 'PolicyNumber', 1, 1 UNION ALL
SELECT 'BOCBranch', 1, 1 UNION ALL
SELECT 'CIFNumber', 1, 1 UNION ALL
SELECT 'EmployeeNumber', 1, 0 UNION ALL
SELECT 'PremiumSign', 1, 0 UNION ALL
SELECT 'RegistrationDate', 1, 0 UNION ALL
SELECT 'ActivityCode', 1, 0 UNION ALL
SELECT 'ActivityDescription', 1, 0 UNION ALL
SELECT 'PolicyTypeCode', 1, 0 UNION ALL
SELECT 'PolicyTypeDescription', 1, 0 UNION ALL
SELECT 'ContributionCode', 1, 0
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += FieldName+','
FROM (SELECT p.FieldName+''+CASE WHEN IsActive=0 THEN '=NULL' ELSE '' END FieldName
FROM @FIELD_ACTIVATIONS p
) AS x;
DECLARE @Querycolumns VARCHAR(MAX)=(select left (@columns, Len ( @columns) - 1 ))
DECLARE @Dynamicquery NVARCHAR(MAX) = '
SELECT '+ @Querycolumns +'
FROM
TABLENAME
'
输出查询将按如下方式运行:
SELECT PolicyNumber,BOCBranch,CIFNumber,EmployeeNumber=NULL,PremiumSign=NULL,RegistrationDate=NULL,ActivityCode=NULL,ActivityDescription=NULL,PolicyTypeCode=NULL,PolicyTypeDescription=NULL,ContributionCode=NULL
FROM
TABLENAME
您将如何编写,这取决于您是否需要性能。如果没有太多行,则可以按如下方式执行:
WITH active AS
(
SELECT FieldName
FROM Field_Activations
WHERE CategoryId=1 AND IsActive=1
)
SELECT
CASE WHEN EXISTS (SELECT * FROM active WHERE FieldName='PolicyNumber')
THEN REPLICATE('0', 10-LEN(PolicyNumber)) + PolicyNumber
ELSE '' END AS PolicyNumber,
CASE WHEN EXISTS (SELECT * FROM active WHERE FieldName='BOCBranch')
then REPLICATE('0', 7-LEN(BOCBranch)) + BOCBranch
ELSE '' end AS BOCBranch,
--...
FROM FileExtraction.EXTR_MILIMETRA
ORDER BY PolicyNumber;
如果您需要一些性能,那么您可以将上述查询作为带有一系列If和execute的动态查询来编写:
DECLARE @SQLString nvarchar(4000);
declare @active table (FieldName varchar(100));
insert into @active (FieldName)
SELECT FieldName
FROM Field_Activations
WHERE CategoryId=1 AND IsActive=1;
SET @SQLString = N'
SELECT ' +
CASE when EXISTS
(SELECT * FROM @active WHERE FieldName = 'PolicyNumber')
THEN 'REPLICATE(''0'', 10-LEN(PolicyNumber)) + PolicyNumber'
ELSE '''''' END + ' AS PolicyNumber,' +
CASE WHEN EXISTS
(SELECT * FROM @active WHERE FieldName = 'BOCBranch')
THEN 'REPLICATE(''0'', 7-LEN(BOCBranch)) + BOCBranch'
ELSE '''''' end + ' AS BOCBranch,' +
--... +
' FROM FileExtraction.EXTR_MILIMETRA
ORDER BY PolicyNumber;'
print @SQLString
EXECUTE sp_executesql @SQLString;
我认为,要做到这一点,需要动态SQL。但是…没有动态SQL可能有更好的方法。我从来没有使用过动态SQL。我去看看。看起来又漂亮又整洁。我想FieldState是我的字段激活表?是的,你说得对,现场激活中的被骗者。那是故意的。例子。PolicyNumber仅对CategoryId 1有效,对其他类别无效。@NikosV,是的,我这样命名是为了采样:)别忘了我没有包括CategoryId条件。好的。稍后说PolicyNumber将停止活动。我必须修改密码,不是吗?@NikosV,没有密码是固定的。只有“fieldStates”中的值会更改。好的。我明天回办公室试试看。我会发回的。