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.
Hur kommer detta sig?
13 svar · 313 visningar · startad av ulsy
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.
Hur kommer detta sig?
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
$query = "insert into t (c1,c2) values ("
if ( $_POST["c1") == "" ) {
$query .= "null"
} else {
$query .= "'" . $_POST["c1") . "'"
}
$query .= ","
if ( $_POST["c2") == "" ) {
$query .= "null"
} else {
$query .= "'" . $_POST["c2") . "'"
}
$query .= ")"
Låter ju sunt.
Hur är det om det är asp?
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. :)
Exempel på hur man sen använder det.
Vid ADO:
rs("strängfält") = NullWhenEmpty(strängvariabel)
rs("nummerfält") = NullWhenEmpty(nummervariabel)
Vid INSERT/UPDATE:
"INSERT INTO tabell(strängfält, nummerfält) VALUES(" & NullWhenEmpty(strängvariabel, "string") & ", " & NullWhenEmpty(nummervariabel, "number") & ")"
Tack Erik, jag får testa och se.
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.
Detta ger bara en post i retur även att det finns flera som borde visas.
Hur kommer det sig?
Nu fungerar det precis som jag vill :)
SELECT * FROM t
WHERE current_date between coalesce(startdatum,current_date)
and coalesce(slutdatum,current_date)
or (startdatum = '' and slutdatum = '')
Tack för hjälpen!!! :e
Okej, men nu klarar du inte av om bara ett av datumen inte är ifyllda.
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
Var det inte precis så jag skrev?
Enda skillnaden är väl paranteser och lite annorlunda formatering. :)
Doh, såg inte ditt inlägg asså.