2016-04-05 50 views
1

'de boş bir dizgeyi sayısal bir boşluğa nasıl dönüştürürüm Bir tabloyu bir hazırlama tablosundaki verilerle doldurmak istiyorum. Aşama tablosundaki ilginç sütun, text veri tipine sahiptir, ancak aksi takdirde, iki katına ayrılabilir veya boş dize olan değerlerle doldurulur (ör. "4.209", "42" veya ""). Hedef tabloda bulunan sütuna, double veri tipine sahiptir. I) Bir Data type mismatch in criteria expression hata alırsınız (ADO) deyimi çalıştırdığınızdaAccess SQL_

ben yürütme am SQL Bildirimi

insert into dest (.., theColumn, ...) select ...., theColumn, .. from src 

olduğunu.

theColumn'u null ile değiştirirseniz, hatasız çalışır. Yani, bir şekilde boş dizeleri null s'ye dönüştürmem gerektiğini düşünüyorum. Mümkün mü?

cevap

1

bir IIf() ifadesini kullanın: eğer theColumn, geçerli bir sayıyı temsil eden ve bu sayıyı döndüren bir dize içerir; aksi halde boş değer.

SELECT IIf(IsNumeric(theColumn), Val(theColumn), Null) FROM src 

Benim ilk dürtü IsNumeric() kullanmaktı. Ancak ben bunun istediğinizi daha doğrudan bir çeviri olduğunu anladım ...

SELECT IIf(theColumn='', Null, Val(theColumn)) FROM src 
0

Boş dizeleri sıfıra dönüştürme belki de işe yarar.

insert into dest (.., theColumn, ...) select ...., theColumn+0, .. from src 
+0

Bu hata ile aynı hatayı alıyorum. –

+0

Bu işlevde * iif (theColumn = '', 0, theColumn) * işte? Bunun gibi * dest içine ekle (.., theColumn, ...) seçin ...., iif (theColumn = '', 0, theColumn), .. src'den * – Blank

0

Sen 0'a "" dönüştürmek için Val kullanabilirsiniz:

insert into dest (.., theColumn, ...) select ...., Val(theColumn), .. from src 

Null eklemek için böyle bir işlevi kullanın:

' Converts a value of any type to its string representation. 
' The function can be concatenated into an SQL expression as is 
' without any delimiters or leading/trailing white-space. 
' 
' Examples: 
' SQL = "Select * From TableTest Where [Amount]>" & CSql(12.5) & "And [DueDate]<" & CSql(Date) & "" 
' SQL -> Select * From TableTest Where [Amount]> 12.5 And [DueDate]< #2016/01/30 00:00:00# 
' 
' SQL = "Insert Into TableTest ([Street]) Values (" & CSql(" ") & ")" 
' SQL -> Insert Into TableTest ([Street]) Values (Null) 
' 
' Trims text variables for leading/trailing Space and secures single quotes. 
' Replaces zero length strings with Null. 
' Formats date/time variables as safe string expressions. 
' Uses Str to format decimal values to string expressions. 
' Returns Null for values that cannot be expressed with a string expression. 
' 
' 2016-01-30. Gustav Brock, Cactus Data ApS, CPH. 
' 
Public Function CSql(_ 
    ByVal Value As Variant) _ 
    As String 

    Const vbLongLong As Integer = 20 
    Const SqlNull  As String = " Null" 

    Dim Sql    As String 
    Dim LongLong  As Integer 

    #If Win32 Then 
     LongLong = vbLongLong 
    #End If 
    #If Win64 Then 
     LongLong = VBA.vbLongLong 
    #End If 

    Select Case VarType(Value) 
     Case vbEmpty   ' 0 Empty (uninitialized). 
      Sql = SqlNull 
     Case vbNull    ' 1 Null (no valid data). 
      Sql = SqlNull 
     Case vbInteger   ' 2 Integer. 
      Sql = Str(Value) 
     Case vbLong    ' 3 Long integer. 
      Sql = Str(Value) 
     Case vbSingle   ' 4 Single-precision floating-point number. 
      Sql = Str(Value) 
     Case vbDouble   ' 5 Double-precision floating-point number. 
      Sql = Str(Value) 
     Case vbCurrency   ' 6 Currency. 
      Sql = Str(Value) 
     Case vbDate    ' 7 Date. 
      Sql = Format(Value, " \#yyyy\/mm\/dd hh\:nn\:ss\#") 
     Case vbString   ' 8 String. 
      Sql = Replace(Trim(Value), "'", "''") 
      If Sql = "" Then 
       Sql = SqlNull 
      Else 
       Sql = " '" & Sql & "'" 
      End If 
     Case vbObject   ' 9 Object. 
      Sql = SqlNull 
     Case vbError   ' 10 Error. 
      Sql = SqlNull 
     Case vbBoolean   ' 11 Boolean. 
      Sql = Str(Abs(Value)) 
     Case vbVariant   ' 12 Variant (used only with arrays of variants). 
      Sql = SqlNull 
     Case vbDataObject  ' 13 A data access object. 
      Sql = SqlNull 
     Case vbDecimal   ' 14 Decimal. 
      Sql = Str(Value) 
     Case vbByte    ' 17 Byte. 
      Sql = Str(Value) 
     Case LongLong   ' 20 LongLong integer (Valid on 64-bit platforms only). 
      Sql = Str(Value) 
     Case vbUserDefinedType ' 36 Variants that contain user-defined types. 
      Sql = SqlNull 
     Case vbArray   ' 8192 Array. 
      Sql = SqlNull 
     Case Else    '  Should not happen. 
      Sql = SqlNull 
    End Select 

    CSql = Sql & " " 

End Function 
+0

Bu, maalesef 'null's yerine 0' değerini ekleyecektir. –

+0

Görüyorum, ama bu "sayısal boş" değil, Null. Bunu sağlayan bir işlev için düzenleme konusuna bakın. – Gustav