2016-04-05 3 views
1

Я хочу заполнить таблицу данными из промежуточной таблицы. Интересный столбец в промежуточной таблице имеет тип данных text, но в остальном заполняется либо значениями, которые можно разделить как удвоенные, либо являются пустой строкой (то есть "4.209", "42" или ""). Соответствующий столбец в таблице назначения имеет тип данных double.Как преобразовать пустую строку в числовой null в Access SQL_

SQL, Изложение выполнения является

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

Когда я исполняю заявление (с использованием ADO) я получаю ошибку Data type mismatch in criteria expression).

Если я заменяю theColumn на null, он работает без ошибок. Итак, я полагаю, что мне нужно каким-то образом преобразовать пустые строки в null. Это возможно?

ответ

1

Используйте IIf() выражение: если theColumn содержит строку, которая представляет действительное число, возвращает это число; иначе возвратите Null.

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

Мой первый порыв был использовать IsNumeric(). Однако я понял, что это более прямой перевод того, что вы запросили ...

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

Преобразование пустых строк в ноль, возможно, также работает.

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

Я получаю такую ​​же ошибку при таком подходе. –

+0

Эта функция * iif (theColumn = '', 0, theColumn) * работает? Подобно этому * insert into dest (.., theColumn, ...) select ...., iif (theColumn = '', 0, theColumn), .. from src * – Blank

0

Вы можете использовать Вал для преобразования "" 0:

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

Чтобы вставить Null использовать такую ​​функцию:

' 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

Это, к сожалению, вставляет '0' вместо 'null'. –

+0

Я вижу, но это не «числовое значение null», но Null. См. Edit для функции, которая предоставляет это. – Gustav

Смежные вопросы