ฉันมีตารางที่ช่องใดช่องหนึ่งสามารถเว้นว่างได้ ฉันกำลังพยายามส่งคืนเฉพาะแถวเหล่านี้โดยที่ฟิลด์นี้ว่างเปล่า แต่ฉันได้รับข้อผิดพลาดอยู่เรื่อย ๆ เพียงแค่ทำ WHERE field = "" ... WHERE field = '' ... WHERE field = null
มีความคิดใดที่ฉันขาดหายไป?
ฉันมีตารางที่ช่องใดช่องหนึ่งสามารถเว้นว่างได้ ฉันกำลังพยายามส่งคืนเฉพาะแถวเหล่านี้โดยที่ฟิลด์นี้ว่างเปล่า แต่ฉันได้รับข้อผิดพลาดอยู่เรื่อย ๆ เพียงแค่ทำ WHERE field = "" ... WHERE field = '' ... WHERE field = null
มีความคิดใดที่ฉันขาดหายไป?
ใน SQL ฟิลด์ว่างทั้งหมดเรียกว่า NULL สำหรับการค้นหา NULL คุณไม่ได้ใช้เท่ากับ (=) แต่ใช้โอเปอเรเตอร์พิเศษ IS NULL:
SELECT * FROM table WHERE field IS NULL
Access ช่วยให้คุณไม่มีฟิลด์ว่างเป็น NULL หากคุณอนุญาตให้ใช้สตริงว่าง นี่เป็นความคิดที่ไม่ดี เนื่องจากจะทำให้แยกแยะภาพระหว่างค่า NULL และสตริงที่มีความยาว 0 ได้ยาก ดังนั้นฉันขอแนะนำให้คุณอย่าอนุญาตใน ฐานข้อมูล
SELECT *
FROM MyTable
WHERE IIF(MyField = ' ', NULL, MyField) IS NULL;
อัปเดต: นี่คือการสาธิตวิธีการทำงานของ "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
อัปเดต 2:
แน่นอนว่า Jet/ACE ไม่ได้แพดฟิลด์ให้มีความยาวคงที่!
ไม่ถูกต้อง. ฐานข้อมูล Access มีประเภทข้อมูลข้อความที่มีความกว้างคงที่ซึ่งโดยทั่วไปเรียกว่า NCHAR(n)
(แม้ว่าจะใช้คำพ้องความหมายอื่นก็ตาม) ซึ่งจะขยายค่าคอลัมน์ให้มีความยาวคงที่...
NCHAR (10) ในตัวออกแบบตาราง Access เป็นประเภทข้อมูลใด
ฉันทำไม่ได้มันจะแสดงในสิ่งที่ออกแบบตารางอย่างถูกต้อง Access UI ยังคงล้าหลังเทคโนโลยี Jet 4.0 มีการละเว้นหลายประการ ฉันยังไม่ได้ติดตั้ง Access ในขณะนี้ - อาจมีคนสามารถเรียกใช้โค้ดต่อไปนี้ เปิด .mdb ใน Access UI แล้วบอกเรา...
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
CHECK
ให้กับคอลัมน์ข้อความทั้งหมดเพื่อไม่อนุญาต: 1) ช่องว่างที่มีความยาวเป็นศูนย์ 2) ช่องว่างนำหน้า 3) ช่องว่างต่อท้าย 4) ช่องว่างสองช่องติดต่อกัน
- person onedaywhen; 19.01.2011
NCHAR(10)
บางทีคุณอาจเรียกใช้โค้ด เปิด .mdb ใน Access แล้วบอกเราว่าคุณเห็นอะไร ทีไอเอ.
- person onedaywhen; 21.01.2011
NCHAR(10)
- เป็นประเภทข้อมูลความกว้างคงที่สำหรับข้อมูลที่มีความกว้างคงที่ ซึ่งเป็นเรื่องปกติมาก ตัวระบุมาตรฐานอุตสาหกรรมส่วนใหญ่ที่ฉันพบมีความกว้างคงที่ เช่น จนถึงทุกวันนี้ ฉันใช้รหัสประเทศ ISO 3166-1 alpha-3, รหัสสกุลเงิน ISO 4217 และรหัส SIC อุตสาหกรรม
- person onedaywhen; 24.01.2011
คุณหมายถึงอะไรโดยข้อผิดพลาด?
แต่ถ้าคุณต้องการรับเฉพาะแถวที่มีฟิลด์ว่าง ให้ลองทำดังนี้:
SELECT * FROM MyTable WHERE LTRIM(RTRIM(ISNULL(MyField, ''))) = ''
คำถามของคุณมี WHERE 3 ข้อหรือไม่ หากเป็นเช่นนั้น ให้เปลี่ยนสองตัวที่สองเป็น OR
ใช่ ฉันกำลังเผชิญกับสิ่งเดียวกัน แต่ในที่สุดฉันก็ลองใช้แบบสอบถาม mySQL ต่อไปนี้ มันใช้งานได้และช่วยฉันไว้
SELECT * from your_table_name WHERE field_name IS NULL;
ดำเนินการต่อด้วยแบบสอบถามนี้จะเลือกเฉพาะแถวที่ว่างเปล่า
...
? - person Mark Peters   schedule 11.01.2011