webForumDet fria alternativet

... WHERE group_id IN (null) ...

11 svar · 268 visningar · startad av mattiasnordin

mattiasnordinMedlem sedan maj 20012 080 inlägg
#1

Hej Alla.

Fick hjälp av sql guden Lars med en sql fråga som använder sig av IN. Detta fick min kod att bli 20 ggr enklare. Superglad. Jag hoppas och undrar nu om man med samma typ av syntax kan hämta ut alla poster som inte ännu fått ett numeriskt värde tilldelat. Antar att värdet är null i dessa poster?

Nedan fungerar bra:

SELECT * FROM T_inventory WHERE group_id IN (1, 3, 6) AND purchased_date < #2005-02-23 10:29:15# ORDER BY purchased_date

Liknande funktion skulle jag vilja få till:

SELECT * FROM T_inventory WHERE group_id IN [b](null)[/b] AND purchased_date < #2005-02-23 10:29:15# ORDER BY purchased_date

:stud

@ndersMedlem sedan juni 200032 969 inlägg
#2

Varför vill du använda IN() till det?

SELECT * FROM T_inventory WHERE group_id IS NULL AND purchased_date < #2005-02-23 10:29:15# ORDER BY purchased_date
mattiasnordinMedlem sedan maj 20012 080 inlägg
#3

Jag har en massa checkboxar och beroende på vilka av dessa som är valda så behöver jag påverka frågan.

Checkboxarna returnerar en kommaseparerad sträng och det blir superenkelt att använda IN då...

Jag håller fortfarande på att labbar men just nu fungerar det utmärkt. Jag vill dock ha en checkbox där man kan få ut de poster som är null.

Just nu är sGroupString som följande beroende på val av checkboxar...
sGroupString = 1, 2, 8

Hade det varit möjligt att köra frågan så att...
sGroupString = 1, 2, null, 8 eller tex sGroupString = null

Så hade jag varit överlycklig :)

<% sql = "SELECT * FROM T_inventory WHERE "
if sGroupString <> "" then ' Frågar efter valda grupper
		sql = sql & " group_id IN (" &sGroupString &")"
end if
	
if sCategoryString <> "" then ' Frågar efter valda kategorier
if sGroupString <> "" then sql = sql & " AND " ' Om tidigare fråga har körts
		sql = sql & " category_id IN (" &sCategoryString &")"
end if
	
if sStatusString <> "" then ' Frågar efter vald status
if sGroupString <> "" or sCategoryString <> "" then sql = sql & " AND " ' Om tidigare fråga har körts
		sql = sql & " status_id IN (" &sStatusString &")"
end if

if sGroupString <> "" or sCategoryString <> "" or sStatusString <> "" then
sql = sql & " AND "
end if

sql = sql & " purchased_date < #"&varBeginDate &"#"
sql = sql & " ORDER BY purchased_date "

response.write sql
set rs = connect.execute(sql)%>
@ndersMedlem sedan juni 200032 969 inlägg
#4

Ok, varför skrev du inte det från början? :)

Jag hade gjort så här:

*) Checkbox för nullvärden, med ett annat namn än de andra.
*) På asp-sidan, kontrollera om checkboxen var ikryssad, om den var det, se till att göra tillägget OR group_id IS NULL i SQL-frågan. (Med parenteser som binder ihop detta villkor med de andra gruppvillkoren såklart.)

mattiasnordinMedlem sedan maj 20012 080 inlägg
#5

Det är ju inte alltför krångligt. En bra ide!

Så får det bli...

God morgon @nders, själv är jag lite trögstartad :)

mattiasnordinMedlem sedan maj 20012 080 inlägg
#6

Inte allt för krångligt... jaha Mattias, du ska vara tyst du.

Det är just det här med paranteserna och dynamiken som gör det knepigt. Jag har fått null sökningen att fungera med @nders förslag men det blir riktigt kladdig kod (tycker jag själv). Kom gärna med förslag...

<!--- BYGGER SQL FRÅGAN --->
<% sql = "SELECT * FROM T_inventory WHERE "
if sGroupString <> "" then ' Frågar efter valda grupper
	sql = sql & " group_id IN (" &sGroupString &")"
end if
[b]
if sGroupString <> "" then 
	if sStatusStringNull <> "" then
	sql = sql & " OR group_id IS NULL "
	end if
else
	if sStatusStringNull <> "" then
	sql = sql & " group_id IS NULL "
	sGroupString = "blajdata"
	end if
end if[/b]

if sCategoryString <> "" then ' Frågar efter valda kategorier
if sGroupString <> "" then sql = sql & " AND " ' Om tidigare fråga har körts
		sql = sql & " category_id IN (" &sCategoryString &")"
end if
	
if sStatusString <> "" then ' Frågar efter vald status
if sGroupString <> "" or sCategoryString <> "" then sql = sql & " AND " ' Om tidigare fråga har körts
		sql = sql & " status_id IN (" &sStatusString &")"
end if

if sGroupString <> "" or sCategoryString <> "" or sStatusString <> "" then
sql = sql & " AND "
end if

sql = sql & " purchased_date < #"&varBeginDate &"#"
sql = sql & " ORDER BY purchased_date "

response.write sql
set rs = connect.execute(sql)%>

Mitt nuvarnade problem är hur jag sätter paranteserna.
Om jag kryssar i alla checkboxar i mitt GUI så ser frågan ut så här. Notera att jag enbart har lagt till NULL möjligheten på Grupper. Vill även ha den möjligheten på Kategorier och status

SELECT * FROM T_inventory WHERE group_id IN (1, 2) OR group_id IS NULL AND category_id IN (15, 16, 22, 23, 24, 25, 27, 28, 29) AND status_id IN (7, 9, 10, 11, 1, 2, 3) AND purchased_date < #2005-02-23 11:18:33# ORDER BY purchased_date

Så nära att få till det precis som jag vill, men ändå inte ;)

@ndersMedlem sedan juni 200032 969 inlägg
#7

Du måste gruppera group-id-villkoren.

(group_id IN (1, 2) OR group_id IS NULL)
mattiasnordinMedlem sedan maj 20012 080 inlägg
#8

Hur ska en fråga se ut igentligen?

SELECT * FROM T_inventory WHERE ( group_id IS NULL ) AND ( status_id IS NULL ) AND purchased_date < #2005-02-23 12:12:56# ORDER BY purchased_date

Jag antar att paranteserna sitter fel. För jag får fel svar även fastän frågan fungerar.

@ndersMedlem sedan juni 200032 969 inlägg
#9

I det här fallet tillför inte parenteserna någonting.
Vad vill du göra?

mattiasnordinMedlem sedan maj 20012 080 inlägg
#10
<!--- BYGGER SQL FRÅGAN --->
<% sql = "SELECT * FROM T_inventory WHERE "
' FRÅGAR EFTER VALDA GRUPPER
if sGroupString <> "" then 
	' Första gruppen start
	sql = sql & "( " 
	sql = sql & " group_id IN (" &sGroupString &") "
		if sGroupStringNull <> "" then
		sql = sql & " OR group_id IS NULL "
		end if
	' Första gruppen slut
	sql = sql & " ) " 
else 
	if sGroupStringNull <> "" then
	sql = sql & " ( group_id IS NULL )"
	sGroupString = "tidigare_fraga_har_korts"
	end if
end if

' FRÅGAR EFTER VALDA KATEGORIER
if sCategoryString <> "" then 
			' Om tidigare fråga har körts
			if sGroupString <> "" then sql = sql & " AND " end if
	' Andra gruppen start
	sql = sql & "( " 
	sql = sql & " category_id IN (" &sCategoryString &")"
		if sCategoryStringNull <> "" then
		sql = sql & " OR category_id IS NULL "
		end if
	' Andra gruppen slut
	sql = sql & " ) " 
else 
	if sCategoryStringNull <> "" then
	sql = sql & " AND ( category_id IS NULL )"
	sCategoryString = "tidigare_fraga_har_korts"
	end if
end if

' FRÅGAR EFTER VALD STATUS	
if sStatusString <> "" then
			' Om tidigare fråga har körts
			if sGroupString <> "" or sCategoryString <> "" then sql = sql & " AND " end if
	' Tredje gruppen start
	sql = sql & "( " 
	sql = sql & " status_id IN (" &sStatusString &")"
		if sStatusStringNull <> "" then
		sql = sql & " OR status_id IS NULL "
		end if
	' Tredje gruppen slut
	sql = sql & " ) " 
else 
	if sStatusStringNull <> "" then
	sql = sql & " AND ( status_id IS NULL )"
	sStatusString = "tidigare_fraga_har_korts"
	end if
end if

if sGroupString <> "" or sCategoryString <> "" or sStatusString <> "" then
sql = sql & " AND "
end if

sql = sql & " purchased_date < #"&varBeginDate &"#"
sql = sql & " ORDER BY purchased_date "

response.write sql
set rs = connect.execute(sql)%>

Så här ser min fråga ut nu. Jag försöker verifiera att jag får ut rätt data genom att klicka alla tänkbara kombinationer i mitt GUI. Klickar man i att man bara ska ha Grupp = null och Status = null så får jag inte ut alla poster som borde komma ut.

Ytterligare en kombination som inte ger något svar fastän det borde det:

SELECT * FROM T_inventory WHERE ( group_id IN (2) OR group_id IS NULL ) AND ( category_id IN (24) ) AND ( status_id IN (7) OR status_id IS NULL ) AND purchased_date < #2005-02-23 12:21:26# ORDER BY purchased_date

Antar att jag gör fel som vanligt ;/
[kod]

@ndersMedlem sedan juni 200032 969 inlägg
#11

SQL-frågorna är riktiga ut. Det är något som inte stämmer med WHERE-satsen mao, eller så stämmer den bara att du inte har koll på datat. ;)

Hur ser datat ut, det som borde returneras av denna SQL-fråga men inte gör så?

mattiasnordinMedlem sedan maj 20012 080 inlägg
#12

Jag inser att jag försöker bygga något som går att förenkla.
Nöjer mig med att enbart Grupp fältet ska få vara null. De andra fälten sätts till 0 istället. Det fungerar då :)

Tack för hjälpen @nders.

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)