简体   繁体   English

如果第一个值为 NULL,如何 select 下一个值

[英]How to select the next value if the first value is NULL

I am trying to write those Select subquery so that if the Top 1 value is NULL, it would move to the next value that is not NULL.我正在尝试编写那些 Select 子查询,以便如果 Top 1 值是 NULL,它将移动到不是 NULL 的下一个值。 Here is the code:这是代码:

----------------- GATHERING DATE DATA FROM ALL 12 MONTH UDF'S INTO TEMP TABLE #tmpAll12MonthForms -----------------
select e.RECORD_ID,e.FORM_INSTANCE_ID,e.FORM_NAME,e.[FIELD_VALUE] as [DATE_FORM_COMPLETED],
    row_number() over (partition by record_id order by cast([FIELD_VALUE] as date) desc) as RowNum into #tmpAll12MonthForms
    from [View_CMMode_UDFData] e
    where e.FORM_DEF_DR IN 
    ('HMFPAT12mPostEn','HMFPAT24mPostEn','HMFPAT36mPostEn'
    ,'HMFPAT48mPostEn','HMFPAT60mPostEn'
    ,'HMFPAT72mPostEn','HMFPATEnroll','PATEnroll'
    ,'HMFPATEnrollV01','SCMTmechvEnroll','HMFSCEnroll','HMFNFP12mPostEn'
    ,'HMFNFP24mPostEn','HMFNFPEnroll')
    AND e.FIELD_DEF_DR in ('PATMIECHV12mPostEn','PATMIECHV24mPostEn'
    ,'PATMIECHV12mPostEnGuideDtVstFrmComp'
    ,'PATMIECHV24mPostEnGuideDtVstFrmComp'
    ,'PATMIECHV36mPostEnGuideDtVstFrmComp'
    ,'MTmechv48mPostEnGuideDt','MTmechv60mPostEnGuideDt'
    ,'MTmechv72mPostEnGuideDt' ,'PATEnrollGuideDt','EnrollGuideDt'
    ,'FSMTmechv12mPostEn','FSMTmechv12mPostEnGuideDt'
    ,'NFPMIECHV12mUpdtGuideDt','NFPMIECHV18mUpdtGuideDt'
    ,'NFPMIECHV24mUpdtGuideDt','NFPMIECHV6mUpdtGuideDt'
    ,'NFPMIECHVEnrollGuideDt')
    group by e.record_id,e.FORM_INSTANCE_ID,FORM_NAME,[FIELD_VALUE]

create unique clustered index All12MonthFormsU on #tmpAll12MonthForms (record_id,form_instance_id)

----------------- GATHERING PRENATAL ENROLLIES DATA FROM UDF INTO TEMP TABLE #tmpPrenatal -----------------
SELECT [RECORD_ID],[FORM_INSTANCE_ID],[field_value] as 'Prenatal status' INTO #tmpPrenatal
    FROM [View_CMMode_UDFData]
    where [SECTION_DEF_DR] in ('MTmechvEnrollInfo','FP') and [FIELD_DEF_DR] in ('MTmechvEnrollInfoChldPNEnroll','FPPG')
    GROUP BY [RECORD_ID],[FORM_INSTANCE_ID],[field_value]

------------- COLLECTING CLIENT PRENATAL ENROLLMENT DATA FOR PAT --------------------
SELECT U.RECORD_ID,u.FORM_INSTANCE_ID,u.[Prenatal status],p.RowNum into #TmpPrenatalEnrollPAT
    FROM #tmpPrenatal u inner join #tmpAll12MonthForms p 
    on p.RECORD_ID = u.RECORD_ID and p.FORM_INSTANCE_ID = u.FORM_INSTANCE_ID 
    group by U.RECORD_ID,u.FORM_INSTANCE_ID,u.[Prenatal status],p.RowNum

----------- THIS IS THE SELECT SUBQUERY I AM WORKING ON. THERE ARE MANY LIKE THIS ONE -------------
,(SELECT TOP 1 [Prenatal status]
FROM #TmpPrenatalEnrollPAT as prenatalEnroll WHERE prenatalEnroll.RECORD_ID = ClientSVC.SVC_ID
ORDER BY prenatalEnroll.RowNum asc
) AS PrenatalEnroll
 ............
 ............

 INTO #TempPrimaryCGPAT
 FROM #tmpClientServices AS ClientSVC 
 INNER JOIN #tmpClients AS Client ON Client.PER_ROWID = ClientSVC.SVC_PersonDR

 SELECT .....................
      ,ClientSVC.PER_PRIMARYLANGUAGE as Client_PrimaryLanguage
      ,PrenatalEnroll as [Prenatally Enroll]
      ,ClientSVC.EnrollDate
      ,.............
  into #TMPpatTable
  FROM #TempPrimaryCGPAT AS ClientSVC
  INNER JOIN E_Entity e (nolock) ON e.ID = ClientSVC.PrimaryCGID
  INNER JOIN #tmpClients AS CAREGIVER ON CAREGIVER.PER_ROWID = e.EntityHx_ID
  INNER JOIN #tmpLastHomeVisitPAT V ON V.RECORD_ID = ClientSVC.SVC_ID

I would need the code to move on to the next value from the Top 1. RowNum in the Order clause is a row number that was created using a partition in a previous table and as things stand it is equal to 1. This is one of many Select subqueries using this Select Top 1 method.我需要代码从前 1 移动到下一个值。Order 子句中的 RowNum 是使用前一个表中的分区创建的行号,就目前而言它等于 1。这是其中之一许多 Select 子查询使用此 Select Top 1 方法。 I am using this method to get the most recent information from the query, but if needed, we could fall back on the next most recent data.我正在使用这种方法从查询中获取最新信息,但如果需要,我们可以使用下一个最新数据。

Here is some sample output.这是一些示例 output。 The entire output is very large with many columns.整个 output 很大,有很多列。

  Caregiver_MaritalStatus
          Married
  Not Married but Living Together with Partner
           NULL
  Not Married but Living Together with Partner
  Never Married (not including not married but living with partner)
  Not Married but Living Together with Partner
           NULL
         Married
  Not Married but Living Together with Partner
  Not Married but Living Together with Partner
  Not Married but Living Together with Partner

To explain what I think this could be, take this simple query为了解释我认为这可能是什么,请使用这个简单的查询

SELECT 
    (SELECT TOP 1 t.name from sys.tables T 
                WHERE 1 = 0 
                AND t.name IS NOT NULL 
                order by T.name
    ) DQ

t.name is probably never NULL, and I would never select it, but I never select a row in any case, so you do see NULL - the subquery returns nothing, NULL t.name is probably never NULL, and I would never select it, but I never select a row in any case, so you do see NULL - the subquery returns nothing, NULL

this second query shows that there are 0 rows, not that NULL field is being obtained by the query第二个查询显示有 0 行,而不是查询正在获取 NULL 字段

    SELECT 
    (SELECT  COUNT(t.name) from sys.tables T 
                WHERE 1 = 0 
                AND t.name IS NOT NULL 

    ) DQ
inner join (SELECT [Prenatal status], RECORD_ID, RowNum
            FROM #TmpPrenatalEnrollPAT
            WHERE RowNum < 4
           ) PreNatalEnroll on PreNatalEnroll.RECORD_ID = ClientSVC.SVC_ID

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM