哪个不是空查询

时间:2013-12-30 19:12:16

标签: sql ms-access

我正在使用非常复杂的UNION ALL查询来将XML导入的信息解析为现有的Access表。我遇到的问题是,当我尝试编写查询时,如果该字段不为null,则仅填充表。我已经尝试在开始时使用IIF语句,并且我在许多不同的迭代中使用各种Null语句,但除了这个没有做任何事情之外都抛出错误

 select SiteVisitCode + '-'  AS Q_SiteVisitCode, IIf ([Sample_Collection_Method_ID] = "SED-CORE-C", SiteVisitCode + '-CC / ' + Station_Name,  IIf ([Sample_Collection_Method_ID] = "CHLPHL-1-C", SiteVisitCode + '-CT / ' + Station_Name,  IIf ([Sample_Collection_Method_ID] = "HOOP-C", SiteVisitCode + '-CH / ' + Station_Name, SiteVisitCode + '-C(A) / ' + Station_Name))),  IIf ([Sample_Collection_Method_ID] = "SED-CORE-C", SiteVisitCode + '-CC ', IIf ([Sample_Collection_Method_ID] = "CHLPHL-1-C", SiteVisitCode + '-CT', IIf ([Sample_Collection_Method_ID] = "HOOP-C", SiteVisitCode + '-CH', SiteVisitCode + '-C(A)'))), 'S-ROUTINE' as Activity_Type, IIf ([Sample_Collection_Method_ID] = "SED-CORE", 'Sediment', IIf ([Sample_Collection_Method_ID] = "SED-CORE-C", 'Sediment','other')), IIF ([COMP]="TRUE", Right([TransectA],Len([TransectA])-InStrRev([TransectA],"/"))+'-C', Right([TransectA],Len([TransectA])-InStrRev([TransectA],"/"))) AS Sample_Collection_Method_ID, '' AS Activity_Comment, 'CLPH' as DEQ_SampleTypeID, 'A' as Activity_Transect, Station_Visit_Date as Activity_Start_Date, Time as Activity_Start_Time
 FROM tblSiteVisit
 WHERE [transectA] is Not Null
 UNION ALL 
 select SiteVisitCode + '-'  AS Q_SiteVisitCode, IIf ([Sample_Collection_Method_ID] = "SED-CORE-C", SiteVisitCode + '-CC / ' + Station_Name,  IIf ([Sample_Collection_Method_ID] = "CHLPHL-1-C", SiteVisitCode + '-CT / ' + Station_Name,  IIf ([Sample_Collection_Method_ID] = "HOOP-C", SiteVisitCode + '-CH / ' + Station_Name, SiteVisitCode + '-C(P) / ' + Station_Name))),  IIf ([Sample_Collection_Method_ID] = "SED-CORE-C", SiteVisitCode + '-CC ', IIf ([Sample_Collection_Method_ID] = "CHLPHL-1-C", SiteVisitCode + '-CT', IIf ([Sample_Collection_Method_ID] = "HOOP-C", SiteVisitCode + '-CH', SiteVisitCode + '-C(P)'))), 'S-ROUTINE' as Activity_Type, IIf ([Sample_Collection_Method_ID] = "SED-CORE", 'Sediment', IIf ([Sample_Collection_Method_ID] = "SED-CORE-C", 'Sediment','other')), IIF ([COMP]="TRUE", Right([TransectP],Len([TransectP])-InStrRev([TransectP],"/"))+'-C', Right([TransectP],Len([TransectP])-InStrRev([TransectP],"/"))) AS Sample_Collection_Method_ID, '' AS Activity_Comment, 'CLPH' as Q_SampleTypeID, 'P' as Activity_Transect, Station_Visit_Date as Activity_Start_Date, Time as Activity_Start_Time
 FROM tblSiteVisit
 WHERE [transectP] is Not Null
 ; 

在下面的示例中,第二个条目不应该存在,因为横断面P为空:

Q_SiteVisitCode|Sample_ID|Activity_ID|Activity_Type|Medium|Activity_Start_Date|Activity_Start_Time|Sample_Collection_Method_ID|Activity_Transect|DEQ_SampleTypeID|Activity_Comment

 test123-|test123-CT / Fish Hatchery|test123-CT|S-ROUTINE|other|12/26/2013|1058|CHLPHL-1-C|A|CLPH   
 test123-|test123-C(P) / Fish Hatchery|test123-C(P)|S-ROUTINE|other|12/26/2013|1058|-C|P|CLPH   

非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

如果你在一起UNIONing的两个查询意味着代表互斥集,那么你需要指出。

在每个查询中,您从同一个表中选择,但使用不同的where子句。在第一个查询中,您说transectA不为null。 TrasnectP在这里仍然可以为空,并且这些记录将被拉入。反之亦然,第二个查询。

正如其他人所说的那样 - 在没有联合的情况下将其写为单个查询,但使用case语句检查transecta或tranectp是否为null并相应地转换该字段。

答案 1 :(得分:1)

你知道你的一个SELECT正在拉出不需要的记录 - 单独运行以找出哪一个。但除此之外,您可以明确地排除不需要的记录,如下所示:

在你的第一个SELECT中:

WHERE [transectA] NOT IN (null,'') AND [transectP] in (null, '')

在你的第二个SELECT中:

WHERE [transectP] NOT IN (null,'') AND [transectA] in (null,'')

FWIW - 你可能会考虑使用SWITCH语句而不是那么多嵌套的IIF语句 - 更容易阅读&排除故障。

答案 2 :(得分:1)

如果transectA是文本数据类型,并且您希望查询忽略该列中包含Null或零长度字符串的行...

WHERE Len([transectA]) > 0