2011-01-10 11 views
2

Ich habe eine Tabelle, wo eines der Felder leer sein kann. Ich versuche nur diese Zeilen zurückzugeben, wenn dieses Feld leer ist. Aber ich bekomme immer Fehler gerade WHERE Feld = "" ... WHERE Feld = '' ... WHERE Feld = nullNur Zeilen zurückgeben, die ein leeres Feld haben?

Irgendwelche Ideen, was ich vermisse?

+1

Was machst du mit dem '...'? –

+0

Ich denke, das veranschaulicht drei mögliche Where-Aussagen. – Fionnuala

Antwort

3

Was meinen Sie mit Fehlern?

Aber, wenn Sie nur die Zeilen erhalten möchten, wo die Felder leer sind, so etwas wie versuchen:

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

Für Access würden Sie Nz statt ISNULL (MyField, '') verwenden. IsNull nimmt nicht mehr als ein Argument. – Fionnuala

+0

Das stimmt. Natürlich benutze ich keinen Zugang, deshalb vergesse ich die Details, wie Access SQL quält. –

+0

Alle Datenbank-Engines haben Variationen in ihrem SQL-Dialekt. -1 für die Veröffentlichung einer Antwort ohne Zugriff. –

12

In SQL wird ein völlig leeres Feld NULL sein, sagte. Für NULL sucht verwenden Sie nicht gleich (=), sondern die speziellen Operator IS NULL:

SELECT * FROM table WHERE field IS NULL 

Zugang ermöglicht es Ihnen nicht NULL leere Felder haben, wenn Sie leere Zeichenfolgen zulassen, ist dies eine schlechte Idee, da es macht Es ist schwierig, visuell zwischen einem NULL-Wert und einer 0-Länge-Zeichenfolge zu unterscheiden, also schlage ich vor, dass Sie es in Ihrer Datenbank nicht zulassen.

+3

Leerzeichen und Nulllängen sind möglich. Um alle Basen abzudecken, können Sie Trim (Feld & "") = "" verwenden. – Fionnuala

+1

Ich werde Zeichenfolgen mit 0 Zeichen als leer akzeptieren, aber persönlich würde ich eine leergefüllte Zeichenfolge nicht als Platzhalter betrachten. In jedem Fall bin ich mir ziemlich sicher, dass das OP-Problem nicht verschiedene Arten von leeren Strings identifiziert, aber den IS NULL-Operator nicht kennt. –

1

Hat Ihre Abfrage drei WHERE-Klauseln? Wenn ja, ändern Sie die zweite zwei bis OR

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

UPDATE: Hier ist ein Beispiel dafür, wie „ANSI padding“ arbeitet in dem Access-Datenbank-Engine (ACE, Jet, was auch immer), die irgendwie notwendig zu sein scheint (sicherlich jeden SQL-Produkt im Land funktioniert auf diese Weise ...?): Einfach in ein VBA (Access, Excel, Word, etc) oder VB6-Modul einfügen und ausführen (keine Referenzen usw. erforderlich): Wenn es stimmt, dass ein einzelnes Leerzeichen gleich ist auf eine leere Zeichenfolge (ZLS) oder eine ‚unbestimmt‘ Anzahl der Leerzeichen, dann werden Sie eine Liste von Y s sehen:

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:

Natürlich füllt Jet/ACE die Felder nicht auf feste Länge!

Falsch. Die Access-Datenbank hat einen festen Breite Textdatentyp allgemein als NCHAR(n) bekannt (obwohl andere Synonym gelten), die in der Tat tut Pad Spaltenwerte feste Länge ...

Welchen Datentyp NCHAR (10) in dem Zugang Tischdesigner?

Ich werde es nicht in der Tabelle Designer Sache richtig angezeigt. Die Access-Benutzeroberfläche bleibt hinter der Jet 4.0-Technologie zurück, es gibt viele solche Auslassungen. Ich habe Access im Moment nicht installiert - vielleicht könnte jemand den folgenden Code ausführen, öffnen Sie die MDB in der Access UI und sagen Sie uns ...?

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 
+0

@Remou: Es wird tatsächlich nach einer ZLS oder einer unbestimmten Anzahl von Leerzeichen gesucht. – onedaywhen

+0

Huh? Wie? Es scheint mir, dass es nach einem einzelnen Leerzeichen sucht und eine ZLS oder eine andere Anzahl von Leerzeichen zurückgibt, wenn die ursprüngliche IIf() Bedingung nicht übereinstimmt. Und es wird keine Indizes verwenden, scheint mir also eine sehr schlechte Idee. –

+0

@ Davide-W-Fenton und @Remou: Sie haben beide MS-Access Badges hier auf SO, das ist fundamentales Zeug! Das Standardverhalten beim Vergleich von zwei Strings für die Gleichheit ist das End-Pad, das kürzere mit Leerzeichen. Selbst wenn Sie sich dessen nicht bewusst waren (schockierend!) Oder vorübergehend vergessen haben, wäre es sicher leicht für Sie zu testen. In einer solchen Community erwarte ich, dass Sie meinen Code sowieso testen, Peer Review und all das. Aber ich nehme an, dass ich meinen Beweis als wirklich einfach zu ausführenden Code veröffentlichen muss (vorausgesetzt, Sie haben die Höflichkeit, sich darum kümmern zu müssen!) – onedaywhen

0

Ja, ich war gleich gegenüber Aber schließlich habe ich versucht, die folgende mysql query es funktionierte und hat mich gerettet.

SELECT * from your_table_name WHERE field_name IS NULL; 

Gehen Sie weiter mit dieser Abfrage nur die Zeilen ausgewählt werden, die leer sind.

Verwandte Themen