簡體   English   中英

當滿足另一個表的條件時如何從表中選擇記錄

[英]How to select records from a table when a condition of another table is satisfied

我有定期運行的查詢。

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。

我需要做的是僅對出現在FieldName中狀態為IsActive = 1的列運行SELECT語句。對於SELECT查詢中狀態為IsActive = 0的列,我仍然想選擇列,但將其顯示為空列。

這一切都無需永久刪除或更改任何表中的任何內容。

我已經嘗試過使用案例,子查詢,IF,並且如果FIELD_ACTIVATIONS表中的任何詳細信息發生更改,我似乎都無法提出不需要將來更改的解決方案。

我還查看了此鏈接,以便根據另一個表中的條件在表中選擇記錄? 但是此鏈接假定兩個表中都有一個公共字段。

SELECT查詢中顯示的名為“ EXTR_MILIMETRA”的主表與FIELD_ACTIVATION沒有共同之處,除了列名和字段名。

這是“ EXTR_MILIMETRA”中各列的示例。 (由於屏幕空間有限,因此未顯示所有列。)下面顯示的每一列是上面的表格的FieldName。

COLUMNNAMES

提出這個問題,我有可能由於先前的連續投票而被封鎖。 如果需要任何其他信息,請先告訴我,而不要投票。 如果可以的話。 我真的盡力描述了我的問題。

很高興做出任何澄清。

您需要的@NikosV是一個動態查詢。 我稱它為@DynamicQuery,並且一種分配要隱藏的列的方法將為它們添加NULL,從而使其輸出為空白。 看一下這個模型,只需將TABLENAME更改為您要從中提取數據的表的實際名稱,然后使用您說過創建的實際FIELD_ACTIVATIONS表即可。

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和執行的動態查詢:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM