Jag exekverar följande sql kommando från vb men det returnerar inga poster: Operationer med null ger null som svar. Testa: Tack, fungerade perfekt. Stiligt! Ska man vara lite petig ska man skriva in id-fältet istället för * i count-funktionen. Då kan man få det att bli ytterligare lite snabbare. Det stämmer ej att COUNT(*) är långsammare än COUNT(kolumnnamn). Och man ska definitivt inte _alltid_ använda COUNT(kolumnnamn), även om det finns situationer när man kan göra det.Sql statement
SELECT * FROM prim_customer WHERE (prim_customer.lastname = 'gunnars bilar') AND (prim_customer.firstname = NULL);
Så här ser det ut, när jag kör det från Mysql's shell:
mysql> SELECT * FROM prim_customer;
+----+-----------+---------------+---------------+----------+---------+---------+------------+--------+------+-------+---------------------+
| id | firstname | lastname | address | postcode | city | country | phone | mobile | fax | email | description |
+----+-----------+---------------+---------------+----------+---------+---------+------------+--------+------+-------+---------------------+
| 1 | Frans | Englich | Fjeliev. 15A | 227-36 | Lund | NULL | 046-148896 | NULL | NULL | NULL | NULL |
| 2 | NULL | Gunnars bilar | bananvagen 12 | 12365 | veberod | NULL | 08-157874 | NULL | NULL | NULL | Gor javla bra bilar |
+----+-----------+---------------+---------------+----------+---------+---------+------------+--------+------+-------+---------------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM prim_customer WHERE (prim_customer.lastname = 'gunnars bilar') AND (prim_customer.firstname = NULL);
Empty set (0.00 sec)
mysql>
firstname är ju NULL och lastname stämmer. Vad är fel?
mvh FransSv: Sql statement
SELECT * FROM prim_customer WHERE (prim_customer.lastname = 'gunnars bilar') AND (prim_customer.firstname Is NULL);Sv: Sql statement
Jag har en till fråga angående null:
Jag kör följande kod men det resulterar i "object required"
If objrst(2) Is Not Null Then
txtLastName.Text = objrst(2)
End If
Jag kan ju inte använda <> istället för "is Not" och = fungerar inte istället för is. vad är lösningen?
mvh FransSv: Sql statement
Jag har en till fråga. Om jag vill ta reda på antalet poster i en tabell, vilken är den snabbaste lösningen? Jag skulle kunna köra t.ex: "SELECT id FROM prim_customer" och sedan checka vad record count är men det verkar lite omständigt..
mvh FransSv: Sql statement
"SELECT Count(id) as RecCount FROM prim_customer"Sv: Sql statement
För det första måste man vara medveten om skillnaden dem emellan. COUNT(kolumnnamn) kommer att räkna antalet rader där kolumnnamn inte är NULL, medan COUNT(*) kommer att räkna antalet rader i tabellen utan att bry sig om vad de innehåller. Alltså kan de ge olika resultat om kolumnnamn tillåter NULL.
Många tror att COUNT(kolumnnamn) skulle vara snabbare än COUNT(*), därför att COUNT(*) skulle behöva läsa in hela raderna från datasidorna för att räkna antalet rader, medan COUNT(kolumnnamn) endast skulle behöva kontrollera den angivna kolumnen. Detta stämmer naturligtvis inte, av flera anledningar.
För det första så kan man inte läsa in endast enstaka kolumner från datasidorna, utan man måste isf läsa in hela datan och sen kontrollera den eftersökta kolumnen.
Finns det ett index som täcker den angivna kolumnen kan man naturligtvis läsa in raderna endast från indexet och kontrollera kolumnen, för att på så vis slippa läsa in hela datasidorna (vilket SQL Server naturligtvis gör automatiskt om den kan). Men det gäller självklart inte bara COUNT(kolumnnamn) utan även COUNT(*) kommer att använda ett sådant index för att räkna antal rader.
I vissa fall kanske det inte finns ett index som täcker den angivna kolumnen men det finns ett (eller flera...) andra index. Isf skulle COUNT(*) gå mycket snabbare, eftersom den skulle nöja sig med att räkna antal rader i indexet när COUNT(kolumnnamn) skulle behöva hämta datasidorna för att kontrollera kolumnens värde.
I vilket fall som helst så går det marginellt (extremt marginellt om det finns ett användbart index på kolumnen) snabbare att köra COUNT(*) eftersom den endast behöver titta i sidhuvudet hur många rader som ingår, medan COUNT(kolumnnamn) måste gå in på varje rad för att kontrollera den angivna kolumnen (förutom om kolumnen ej tillåter NULL-värden, i vilket fall 'det blir oavgjort').
Som jag nämnde i början finns det naturligtvis situationer när man vill köra COUNT(kolumnnamn), exempelvis om man endast är intresserad av de rader där värdet i kolumnen ej är NULL.
Bonuspoäng till den som nämner en typisk sådan situation där man ska använda COUNT(kolumnnamn) istället för COUNT(*). En ledtråd är att det har att göra med att använda COUNT tillsammans med något annat... :)