2011-01-10 5 views
2

필드 중 하나가 비어있는 테이블이 있습니다. 이 필드가 비어있는 행만 반환하려고합니다. 하지만 난 그냥 필드 = ""... WHERE field = ''... WHERE field = null을 수행하는 중 오류가 계속 발생빈 필드가있는 행만 반환합니까?

내가 누락 된 아이디어가 있습니까?

+1

무엇을 '...'에 넣고 있습니까? –

+0

나는 이것이 가능한 세 가지 Where 문을 설명한다고 생각합니다. – Fionnuala

답변

3

오류로 인한 결과는 무엇입니까?

그러나, 당신은 필드가 비어 단지 그 행을 얻으려면, 따라서 같은 것을 시도 : SQL에서

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

액세스하려면 ISNULL (MyField, '') 대신 Nz를 사용하십시오. IsNull은 하나 이상의 인수를 취하지 않습니다. – Fionnuala

+0

사실입니다. 물론 액세스를 사용하지 않으므로 Access에서 SQL을 고문하는 방법을 잊어 버리는 경향이 있습니다. –

+0

모든 데이터베이스 엔진에는 SQL 언어 변형이 있습니다. 액세스 할 수없는 답변을 게시하는 경우 -1 –

12

, 완전히 빈 필드는 NULL이라고합니다. NULL이 검색 당신은 등호 (=)를 사용하지 않는, 오히려 특별한 연산자는 NULL : 그것은 만들면서

SELECT * FROM table WHERE field IS NULL 

액세스하면 빈 문자열이 허용하는 경우 당신이하지 NULL 빈 필드를 가질 수 있습니다, 이것은 좋은 생각이다 NULL 값과 길이가 0 인 문자열 사이의 시각적 구분이 어렵 기 때문에 데이터베이스에 허용하지 않는 것이 좋습니다.

+3

공간이 채워지고 길이가 0 인 문자열이 가능하므로 모든베이스를 포함하기 위해 자르기 (필드 & "") = ""를 사용할 수 있습니다. – Fionnuala

+1

길이가 0 인 문자열을 비어있는 것으로 받아들이 겠지만 개인적으로는 공백으로 채워진 문자열을 비어있는 것으로 간주하지 않습니다. 어쨌든 질문에서 나는 OP 문제가 여러 종류의 빈 문자열을 식별하지 못하고 IS NULL 연산자를 알지 못한다는 것을 확신합니다. –

1

쿼리에 세 개의 WHERE 절이 있습니까? 여기에 "ANSI 패딩은"액세스 데이터베이스 엔진에서 작동하는 방법의 데모 (ACE가, 제트는, 무엇이든), 어떻게 든 필요한 것 같다 (확실히 모든이의 : 그렇다면, 두 번째로 두

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

UPDATE 변경 이 방법으로 SQL 제품을 만들면 ...?) : VBA (Access, Excel, Word 등) 또는 VB6 모듈에 붙여넣고 실행 (참조 등은 필요 없음) : 단일 공간이 동일하면 true이면

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 :

길이가 0 인 문자열 (ZLS) 나 공백의 '미확인'번호로 당신은 Y의 목록을 볼 수 있습니다

확실히 Jet/ACE는 고정 길이로 필드 을 채우지 않습니다!

잘못된 것입니다. 액세스 데이터베이스는 고정 길이로 사실상 패드 열 값 않는 일반적 NCHAR(n) 알려진 고정 폭 텍스트 데이터 유형 (다른 동의어 적용하지만) ... 갖는 데이터 타입이 통로 (10) NCHAR 무엇

테이블 디자이너?

테이블 디자이너 일에 올바르게 표시되지 않습니다. 액세스 UI는 여전히 Jet 4.0 기술에 뒤지지 만, 이러한 많은 누락이 있습니다. 현재 Access가 설치되어 있지 않습니다. 아마도 누군가 다음 코드를 실행하고 액세스 UI에서 .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 
+0

@Remou : 실제로 ZLS 또는 미확인 공간 수를 확인합니다. – onedaywhen

+0

어? 방법? 그것은 나에게 그것은 하나의 공간을 검사하고 초기 IIf() 조건이 일치하지 않으면 ZLS 또는 다른 수의 공백을 반환합니다. 그리고 그것은 인덱스를 사용하지 않을 것입니다, 그래서 나에게는 아주 나쁜 생각처럼 보입니다. –

+0

@ Davide-W-Fenton and @Remou : 당신은 모두 여기에 MS-Access 배지를 가지고 있습니다. 이것은 근본적인 것입니다! 두 문자열이 동일한 지 비교할 때 표준 동작은 끝 부분을 공백 문자로 끝내십시오. 비록 당신이 이것을 깨닫지 못했다고해도 (충격적입니다!) 잠시 잊어 버렸을지라도, 분명히 당신이 테스트하기 란 정말 쉽습니다. 이와 같은 커뮤니티에서 필자는 필자가 코드를 테스트하고 동료 평가를 수행 할 것을 기대합니다. 하지만 코드를 실행하기가 쉽다는 증거를 게시해야합니다. – onedaywhen

0

그래, 나는 똑같이 직면했다. 그러나 마침내 나는 그것을 작동시키고 저장 한 다음의 MySQL 쿼리를 시도했다.

SELECT * from your_table_name WHERE field_name IS NULL; 

이 쿼리를 계속 진행하면 비어있는 행만 선택됩니다.

관련 문제