Jag skickar ett formulär där ett fält har som standard NULL.
Även om jag inte skriver något i fältet blir det inte NULL.
Däremot om jag tar bort textfältet från formuläret så blir det NULL.
Om du inte fyller i ett fält så blir det en tom sträng. Om du utelämnar fältet så kommer det inte med alls i din insert och då blir det default-värdet som lagras (default-värdet är null default.)
Om du vill ha null om man inte fyller i ett fält så får du koda det själv
Enklast är att använda ADO för då skiljer man inte på strängar och tal och kan använda en sån här funktion:
Function NullWhenEmpty(ByVal sValue)
If Len(Trim(sValue & "")) = 0 Then
NullWhenEmpty = Null
Else
NullWhenEmpty = sValue
End If
End Function
Om man använder INSERT/UPDATE så får man väl skriva nåt sånt här:
Function NullWhenEmpty(ByVal sValue, ByVal sDataType)
If Len(Trim(sValue & "")) = 0 Then
NullWhenEmpty = "NULL"
ElseIf sDataType = "string" Then
NullWhenEmpty = "'" & sValue & "'"
ElseIf sDataType = "number" Then
NullWhenEmpty = sValue
End If
End Function
Sen kanske det finns andra datatyper där man skriver annorlunda (#?), men du fattar nog poängen.
Allt grunda sig i följande kod som LarsG hjälpte mig med:
select * from t
where current_date between coalesce(startdatum,current_date)
and coalesce(slutdatum,current_date)
or (startdatum is null and slutdatum is null)
Kan man skriva om den så det inte är null utan ? vad det nu är som den lägger till själv?
Så här hade jag skrivit (om jag nu inte kört med NULL, vilket jag hade gjort):
SELECT * FROM t
WHERE CURRENT_DATE BETWEEN (CASE WHEN startdatum = '' THEN CURRENT_DATE ELSE startdatum END)
AND (CASE WHEN slutdatum = '' THEN CURRENT_DATE ELSE slutdatum END)
Sista raden är onödig eftersom att man redan hanterar när datum är null. Däremot vet jag inte hur bra CASE funkar i MySQL.
SELECT * FROM t
WHERE current_date between coalesce(startdatum,current_date)
and coalesce(slutdatum,current_date)
or (startdatum = '' and slutdatum = '')
Coalesce är bara relevant om det ligger null i kolumnerna
SELECT * FROM t
WHERE current_date between
case when startdatum = '' then current_date else startdatum end
and case when slutdatum = '' then current_date else slutdatum end