我有一张表格,其中一个字段可能为空。我想只返回这些字段为空的行。但是我一直在尝试使用 WHERE field = "" ... WHERE field = '' ... WHERE field = null 时遇到错误。
你有什么建议吗?
在SQL中,一个完全空的字段被称为NULL。对于NULL的搜索,您不使用等号(=),而是使用特殊的运算符IS NULL:
SELECT * FROM table WHERE field IS NULL
如果允许空字符串,则Access允许您拥有非NULL空字段,但这是一个不好的主意,因为它使得很难区分NULL值和长度为0的字符串,所以我建议在数据库中不允许它。
SELECT *
FROM MyTable
WHERE IIF(MyField = ' ', NULL, MyField) IS NULL;
更新:这里有一个演示“ANSI填充”在Access数据库引擎(ACE,Jet等)中的工作方式的示例,这似乎是必要的(肯定每个SQL产品都是这样工作的...?):只需将其粘贴到任何VBA(Access,Excel,Word等)或VB6模块中并运行(不需要引用等):如果一个单一的空格等于零长度字符串(ZLS)或一个'未确定'数量的空格,那么你将看到一个Y
列表:
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
更新2:
当然,Jet/ACE不会使字段填充到固定长度!
不正确。Access数据库有一个固定宽度的文本数据类型,通常称为NCHAR(n)
(虽然有其他同义词),它确实将列值填充到固定长度...
Access表设计器中的NCHAR(10)是哪种数据类型?
我认为它在表设计器中不能正确显示。Access用户界面仍落后于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
CHECK
约束来禁止:1)零长度空格,2)前导空格,3)尾随空格,4)连续两个空格。 - onedaywhenSELECT * FROM MyTable WHERE LTRIM(RTRIM(ISNULL(MyField, ''))) = ''
是的,我也遇到了同样的问题。但最终我尝试了以下的mysql查询语句,它起作用了并且帮助了我。
SELECT * from your_table_name WHERE field_name IS NULL;
执行此查询,它将仅选择空行。
你的查询语句有三个WHERE子句吗?如果是这样,请将后两个改为OR。
...
里放了什么? - Mark Peters