只返回空字段的行?

时间:2011-01-10 21:31:17

标签: sql ms-access

我有一张表,其中一个字段可以为空。我试图只返回这个字段为空的行。但是我一直在做错误只做WHERE field =“”...... WHERE field =''... WHERE field = null

我缺少什么想法?

5 个答案:

答案 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;

继续这个查询,它只会选择空的行。