SQL将Access数据库空值转换为空字符串

问题描述:

我被困在试图修复这个错误,并且一直在它太久。我做了很多谷歌搜索和搜索这个网站,但似乎无法为我找到正确的答案,即使这个问题有很多不同的变体。SQL将Access数据库空值转换为空字符串

我正在写一个前端GUI,使用VB.Net和后端的Access数据库。该数据库在我的合作伙伴表中的PartnerFirstName,PartnerLastNameOrganization中有NULL值。我将它们加载到我的应用程序中的Datatable中,以便用户可以搜索它们。上周我发现一些合作伙伴(具有NULL值的合作伙伴)没有加载。下面

代码:

("SELECT IDPartner, IIF(ISNULL(PartnerFirstName),'',PartnerFirstName) as PartnerFirstName, IIF(ISNULL(PartnerLastName), '', PartnerLastName) AS PartnerLastName, IIF(ISNULL(Organization), '', Organization) AS Organization, " & _ 
     "Address1, City, State, Zip, Country, Active " & _ 
"FROM tblPartner " & _ 
"WHERE IDPartner like '%" & txtPartnerID.Text & "%' AND " & _ 
"  PartnerFirstName like '%" & txtFirstName.Text & "%' AND " & _ 
"  PartnerLastName like '%" & txtLastName.Text & "%' AND " & _ 
"  Organization like '%" & txtOrganization.Text & "%' AND " & _ 
"  Address1 like '%" & txtStreet.Text & "%' AND " & _ 
"  City like '%" & txtCity.Text & "%' AND " & _ 
"  State like '%" & txtState.Text & "%' AND " & _ 
"  Zip like '%" & txtZipCode.Text & "%' AND " & _ 
"  Country like '%" & txtCountry.Text & "%' " & _ 
"ORDER BY IDPartner, partnerlastname, partnerfirstname", cn) 

的原因like s为,因为我想搜索实时基于窗体的文本框的值更新。这是我的问题的来源,因为它们默认为空白,而数据库有空值。

===================

编辑:

感谢的初步意见。我现在意识到我正在使用不正确的功能。 Baro建议的IIF现在让我通过SQL,这非常棒!

看来我遇到的记录没有显示的问题在我的WHERE子句中。如果我删除它,那么所有记录都会加载到我的Datatable中。当我如图所示包含Where子句时,记录将排除NULL值。

我试过使用OR PartnerFirstName IS NULL(以及其他字段),但是会留下太多额外的结果,也有NULL值。我不知道该怎么做才能进行搜索,现在我知道问题出在声明的Where部分。

+0

它是SQL Server还是Access?它们不是同一件事。您链接的MSDN文章适用于SQL Server。在Access中,相当于Nz函数。 – Rabbit

+1

尝试:IIF(ISNULL(PartnerFirstName),'',PartnerFirstName)...然后纠正您的第一个错误,您错过了“AND”。 – Baro

+0

您需要查看针对Access执行的查询;访问没有第二个参数ISNULL – techspider

感谢大家的帮助和建议,我从这几个建议中学到了很多,真的很感激!

我已经通过回到Access来解决问题。我在任何NULL字段上运行更新查询并将其更改为“”。这样简单的解决方案!

如果我没有WHERE要求,那么我做这件事就不会有这么大的事。

问题是WHERE谓词是针对原始字段,它没有应用IIF(ISNULL(...))表达式。 很难看到,因为您已将SELECT语句中的字段与基础字段的名称混淆在一起。所以,查询是按照你指示它做的,尽管不是你想要做的。 要解决,我会使用子查询将NULL值转换为空字符串,然后在外部查询中添加您的WHERE谓词。像下面这样的应该做的伎俩:

("SELECT q.* FROM (SELECT IDPartner, IIF(ISNULL(PartnerFirstName),'',PartnerFirstName) as PartnerFirstName, IIF(ISNULL(PartnerLastName), '', PartnerLastName) AS PartnerLastName, IIF(ISNULL(Organization), '', Organization) AS Organization, " & _ 
     "Address1, City, State, Zip, Country, Active " & _ 
"FROM tblPartner) q " & _ 
"WHERE q.IDPartner like '%" & txtPartnerID.Text & "%' AND " & _ 
"  q.PartnerFirstName like '%" & txtFirstName.Text & "%' AND " & _ 
"  q.PartnerLastName like '%" & txtLastName.Text & "%' AND " & _ 
"  q.Organization like '%" & txtOrganization.Text & "%' AND " & _ 
"  q.Address1 like '%" & txtStreet.Text & "%' AND " & _ 
"  q.City like '%" & txtCity.Text & "%' AND " & _ 
"  q.State like '%" & txtState.Text & "%' AND " & _ 
"  q.Zip like '%" & txtZipCode.Text & "%' AND " & _ 
"  q.Country like '%" & txtCountry.Text & "%' " & _ 
"ORDER BY q.IDPartner, q.partnerlastname, q.partnerfirstname", cn) 
+0

感谢蒂姆,我解决了这个问题,在我的数据库中运行更新查询来更新所有NULL字段为“”。 NULLS在近期转入我们的新系统期间将坏数据带入表中的结果。 “ – mrmiller1023

+0

NULL和”“意味着两个完全不同的东西,所以简单地将NULL更新为”“会改变数据的含义。在你的情况下,它表示“我们问那个人,他说他没有合作伙伴”,因为NULL _COULD_的意思是“哦,废话,我们忘了问。” – Jeroen

+0

Jeroen, 我得到你在说什么,我知道NULL和“”之间的区别。在这种情况下,我一直在使用这个数据库6年,并正在重新设计它。虽然我认识到这两种类型之间的差异“”足以满足我们在这里所做的工作。 – mrmiller1023