webForumDet fria alternativet

Varför inte NULL?

13 svar · 313 visningar · startad av ulsy

ulsyMedlem sedan aug. 2002121 inlägg
#1

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?

LarsGMedlem sedan dec. 200012 465 inlägg
#2

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 .= ")"
ulsyMedlem sedan aug. 2002121 inlägg
#3

Låter ju sunt.
Hur är det om det är asp?

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#4

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. :)

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#5

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") & ")"
ulsyMedlem sedan aug. 2002121 inlägg
#6

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?

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#7

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.

ulsyMedlem sedan aug. 2002121 inlägg
#8

Detta ger bara en post i retur även att det finns flera som borde visas.
Hur kommer det sig?

ulsyMedlem sedan aug. 2002121 inlägg
#9

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

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#10

Okej, men nu klarar du inte av om bara ett av datumen inte är ifyllda.

LarsGMedlem sedan dec. 200012 465 inlägg
#11

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
Erik JuhlinMedlem sedan maj 20007 625 inlägg
#12

Var det inte precis så jag skrev?
Enda skillnaden är väl paranteser och lite annorlunda formatering. :)

LarsGMedlem sedan dec. 200012 465 inlägg
#13

Doh, såg inte ditt inlägg asså.

ulsyMedlem sedan aug. 2002121 inlägg
#14

Fungerar perfekt!

Tack för hjälpen!
:)

Genererad på 370 ms · cache AV · v20260730165559-full.f96bc7eb