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
ОБНОВЛЕНИЕ2:
Конечно, 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
person
onedaywhen
schedule
11.01.2011
...
? - person Mark Peters   schedule 11.01.2011