我有一张表,其中一个字段可以为空。我试图只返回这个字段为空的行。但是我一直在做错误只做WHERE field =“”...... WHERE field =''... WHERE field = null
我缺少什么想法?
答案 0 :(得分:13)
在SQL中,一个完全空的字段被称为NULL。对于NULL搜索,您不使用equals(=),而是使用特殊运算符IS NULL:
SELECT * FROM table WHERE field IS NULL
如果你允许空字符串,访问允许你没有NULL空字段,这是一个坏主意,因为它很难区分NULL值和0长度字符串之间的视觉,所以我建议你不允许它在你的数据库中。
答案 1 :(得分:4)
SELECT *
FROM MyTable
WHERE IIF(MyField = ' ', NULL, MyField) IS NULL;
更新:这里是一个演示“ANSI填充”如何在Access数据库引擎(ACE,Jet,无论如何)中工作,这在某种程度上似乎是必要的(当然每个SQL产品都以这种方式工作......?) :只需粘贴到任何VBA(Access,Excel,Word等)或VB6模块并运行(不需要引用等):如果单个空格等于零长度字符串(ZLS)或'未确定' '空格数,然后您将看到Y
s的列表:
Sub Fundamentals()
On Error Resume Next
Kill Environ$("temp") & "\DropMe.mdb"
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & _
Environ$("temp") & "\DropMe.mdb"
With .ActiveConnection
Dim SQL As String
SQL = _
"SELECT IIF(SPACE(0) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(1) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(2) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(3) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(4) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(5) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(55) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(99) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(255) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(4321) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(54321) = SPACE(1), 'Y', 'N')," & vbCr & _
" IIF(SPACE(654321) = SPACE(1), 'Y', 'N');"
.Execute SQL
Dim rs
Set rs = .Execute(SQL)
MsgBox rs.GetString(, , vbCr)
End With
Set .ActiveConnection = Nothing
End With
End Sub
UPDATE2:
当然Jet / ACE不填充字段 固定长度!
不正确的。 Access数据库具有固定宽度的文本数据类型,通常称为NCHAR(n)
(尽管其他同义词适用),它确实将列值填充到固定长度...
NCHAR(10)中的数据类型是什么 访问表设计器?
我不会在表设计器中正确显示它。 Access UI仍然落后于Jet 4.0技术,有很多这样的遗漏。我目前没有安装Access - 也许有人可以运行以下代码,在Access UI中打开.mdb并告诉我们......?
Sub AccessNChar()
On Error Resume Next
Kill Environ$("temp") & "\DropMe.mdb"
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & _
Environ$("temp") & "\DropMe.mdb"
With .ActiveConnection
Dim Sql As String
Sql = "CREATE TABLE TestNChar (col1 NCHAR(10));"
.Execute Sql
Sql = "INSERT INTO TestNChar (col1) VALUES (SPACE(1));"
.Execute Sql
Sql = "SELECT LEN(col1) FROM TestNChar;"
Dim rs
Set rs = .Execute(Sql)
MsgBox rs.GetString
End With
Set .ActiveConnection = Nothing
End With
End Sub
答案 2 :(得分:3)
错误是什么意思?
但是,如果你想获得字段为空的行,请尝试这样的事情:
SELECT * FROM MyTable WHERE LTRIM(RTRIM(ISNULL(MyField, ''))) = ''
答案 3 :(得分:1)
您的查询是否有三个WHERE子句?如果是这样,将第二个更改为OR
答案 4 :(得分:0)
是的,我面对同样但最后我尝试了以下的mysql查询,并且保存了我。
SELECT * from your_table_name WHERE field_name IS NULL;
继续这个查询,它只会选择空的行。