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 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
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 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.)
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 :)
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 Du måste gruppera group-id-villkoren.
(group_id IN (1, 2) OR group_id IS NULL)
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 I det här fallet tillför inte parenteserna någonting.
Vad vill du göra?
<!--- 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 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å?
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.