Возвращать только строки с пустым полем?

У меня есть таблица, где одно из полей может быть пустым. Я пытаюсь вернуть только эти строки, где это поле пусто. Но я продолжаю получать ошибки, просто выполняя WHERE field = ""... WHERE field = ''... WHERE field = null

Любые идеи, что мне не хватает?

Ответ 1

В SQL полное пустое поле называется NULL. Для поиска NULL вы не используете equals (=), а скорее специальный оператор IS NULL:

 SELECT * FROM table WHERE field IS NULL

Доступ позволяет не иметь пустых полей NULL, если вы разрешаете пустые строки, это плохая идея, так как это затрудняет различение визуального изображения между значением NULL и длиной в 0 длины, поэтому я предлагаю вам не разрешать это в вашей базе данных.

Ответ 2

SELECT * 
  FROM MyTable 
 WHERE IIF(MyField = ' ', NULL, MyField) IS NULL;

UPDATE: здесь демонстрируется, как "ANSI padding" работает в Access Database Engine (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 не заполняет поля до фиксированной длины!

Неправильно. База данных доступа имеет тип текстовой информации с фиксированной шириной, обычно известный как NCHAR(n) (хотя применяется и другой синоним), который действительно устанавливает значения столбцов в фиксированную длину...

Какой тип данных NCHAR (10) в Дизайнер таблицы доступа?

Я не верю в конструктор таблицы правильно. Пользовательский интерфейс доступа по-прежнему отстает от технологии Jet 4.0, есть много таких упущений. На данный момент у меня нет доступа. Возможно, кто-то может запустить следующий код, откройте .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

Ответ 3

Что вы подразумеваете под ошибками?

Но если вы хотите получить только те строки, где поля пустые, попробуйте что-то вроде этого:

SELECT * FROM MyTable WHERE LTRIM(RTRIM(ISNULL(MyField, ''))) = ''

Ответ 4

Есть ли у вашего запроса три предложения WHERE? Если это так, измените второй второй на OR

Ответ 5

Да, я столкнулся с тем же. Но, наконец, я попробовал следующий запрос mysql, который он сработал, и сохранил меня.

  SELECT * from your_table_name WHERE field_name IS NULL;

Вперед с этим запросом он выберет только пустые строки.