Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当满足另一个表的条件时,如何从表中选择记录_Sql_Sql Server_Ssms - Fatal编程技术网

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”中的值会更改。好的。我明天回办公室试试看。我会发回的。