Вернуть только те строки, которые имеют пустое поле? - PullRequest
3 голосов
/ 11 января 2011

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

Есть идеи, что мне не хватает?

Ответы [ 5 ]

13 голосов
/ 11 января 2011

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

 SELECT * FROM table WHERE field IS NULL

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

4 голосов
/ 11 января 2011
SELECT * 
  FROM MyTable 
 WHERE IIF(MyField = ' ', NULL, MyField) IS NULL;

ОБНОВЛЕНИЕ: вот демонстрация того, как "заполнение ANSI" работает в Механизме доступа к базе данных (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?

Не знаю, будет ли это правильно в конструкторе таблиц.Интерфейс Access по-прежнему отстает от технологии Jet 4.0, таких упущений много.В настоящий момент у меня не установлен Access - возможно, кто-то может запустить следующий код, открыть .mdb в пользовательском интерфейсе Access и сообщить нам ...?

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 голосов
/ 11 января 2011

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

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

SELECT * FROM MyTable WHERE LTRIM(RTRIM(ISNULL(MyField, ''))) = ''
1 голос
/ 11 января 2011

Есть ли в вашем запросе три предложения WHERE? Если это так, измените вторые два на ИЛИ

0 голосов
/ 25 ноября 2017

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

  SELECT * from your_table_name WHERE field_name IS NULL;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...