/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL 4.0 - Strengfunktioner og WHERE
Fra : Jimmy


Dato : 06-08-03 10:02

Hej

Jeg ønsker at anvende strengfunktioner på kolonner, give resultatet et alias
og bagefter anvende resultatet i en WHERE-klausul via *aliaserne*.

Eks:

SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
FROM test
WHERE LEFT(Navn, 4) = 'John'


Jeg får fejlen: "Unknown column 'Navn' in 'where clause' "


Det sjove er så, at man *godt* kan anvende aliaset i en ORDER BY:


SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
FROM test
ORDER BY Navn ASC


1) Hvorfor kan jeg anvende aliaset i ORDER BY og ikke i WHERE?
2) Hvordan kan jeg komme til at anvende aliaset i WHERE?

Mvh
Jimmy


PS.: Hvis nogen vil teste dette, kan de afvikle følgende:

CREATE TABLE `test` (
`Fornavn` varchar(50) NOT NULL default '',
`Efternavn` varchar(50) NOT NULL default ''
) TYPE=MyISAM;


INSERT INTO `test` VALUES ('John', 'Hansen');




 
 
Martin Sveegaard (06-08-2003)
Kommentar
Fra : Martin Sveegaard


Dato : 06-08-03 10:25

On Wed, 6 Aug 2003 11:02:21 +0200, "Jimmy" <nyhedsgruppe@get2net.dk>
wrote:

>SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
>FROM test
>WHERE LEFT(Navn, 4) = 'John'
>
>
>Jeg får fejlen: "Unknown column 'Navn' in 'where clause' "

Du kan bruge HAVING:

SELECT CONCAT_WS( ' ', Fornavn, Efternavn ) AS Navn
FROM test
HAVING LEFT( Navn, 4 ) = 'John'
MVH Martin S

Morten Guldager (06-08-2003)
Kommentar
Fra : Morten Guldager


Dato : 06-08-03 16:46

Wed, 06 Aug 2003 at 09:25 GMT Martin Sveegaard wrote
> On Wed, 6 Aug 2003 11:02:21 +0200, "Jimmy" <nyhedsgruppe@get2net.dk>
> wrote:
>
>>SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
>>FROM test
>>WHERE LEFT(Navn, 4) = 'John'
>>
>>Jeg får fejlen: "Unknown column 'Navn' in 'where clause' "
>
> Du kan bruge HAVING:

Bruger man HAVING som WHERE kan mysqld ikke bruge index'erne.

Se her:

mysql> desc klonk;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| i | int(11) | | PRI | 0 | |
| v | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

mysql> select * from klonk;
+-----+----------+
| i | v |
+-----+----------+
| 42 | PONGPONG |
| 123 | pling |
+-----+----------+
2 rows in set (0.03 sec)

mysql> explain select * from klonk where i = 1;
+-----------------------------------------------------+
| Comment |
+-----------------------------------------------------+
| Impossible WHERE noticed after reading const tables |
+-----------------------------------------------------+
1 row in set (0.03 sec)

mysql> explain select * from klonk having i = 1;
+-------+------+---------------+------+---------+------+------+-------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+---------------+------+---------+------+------+-------+
| klonk | ALL | NULL | NULL | NULL | NULL | 2 | |
+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.04 sec)

mysql> explain select * from klonk where i = 42;
+-------+-------+---------------+---------+---------+-------+------+-------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+-------+---------------+---------+---------+-------+------+-------+
| klonk | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+-------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.03 sec)

mysql> explain select * from klonk having i = 42;
+-------+------+---------------+------+---------+------+------+-------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+---------------+------+---------+------+------+-------+
| klonk | ALL | NULL | NULL | NULL | NULL | 2 | |
+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.03 sec)




/Morten

Peter Brodersen (06-08-2003)
Kommentar
Fra : Peter Brodersen


Dato : 06-08-03 18:50

On Wed, 06 Aug 2003 15:45:44 GMT, Morten Guldager <spamtrap@mogul.dk>
wrote:

>>>SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
>>>FROM test
>>>WHERE LEFT(Navn, 4) = 'John'
>>>
>>>Jeg får fejlen: "Unknown column 'Navn' in 'where clause' "
>>
>> Du kan bruge HAVING:
>
>Bruger man HAVING som WHERE kan mysqld ikke bruge index'erne.

MySQL bruger dog heller ikke indexes på feltnavne inde i funktioner.

WHERE LEFT(Navn, 4) = 'John'
... bruger ikke index.

WHERE navn LIKE "John%"
... bruger index.


--
- Peter Brodersen

Ugens sprogtip: parentes (og ikke parantes)

Morten Guldager (06-08-2003)
Kommentar
Fra : Morten Guldager


Dato : 06-08-03 19:57

Wed, 06 Aug 2003 at 17:50 GMT Peter Brodersen wrote
> On Wed, 06 Aug 2003 15:45:44 GMT, Morten Guldager <spamtrap@mogul.dk>
> wrote:
>
>>>>SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
>>>>FROM test
>>>>WHERE LEFT(Navn, 4) = 'John'
>>>>
>>>>Jeg får fejlen: "Unknown column 'Navn' in 'where clause' "
>>>
>>> Du kan bruge HAVING:
>>
>>Bruger man HAVING som WHERE kan mysqld ikke bruge index'erne.
>
> MySQL bruger dog heller ikke indexes på feltnavne inde i funktioner.

Ah, jeg overså funktionskaldet. Men ja, Jimmy gør en brav indsats
for at besværliggøre MySQL's arbejde


/Morten

Martin Sveegaard (06-08-2003)
Kommentar
Fra : Martin Sveegaard


Dato : 06-08-03 22:53

On Wed, 06 Aug 2003 18:56:53 GMT, Morten Guldager <spamtrap@mogul.dk>
wrote:

>Wed, 06 Aug 2003 at 17:50 GMT Peter Brodersen wrote
>> On Wed, 06 Aug 2003 15:45:44 GMT, Morten Guldager <spamtrap@mogul.dk>
>> wrote:
>>
>>>>>SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
>>>>>FROM test
>>>>>WHERE LEFT(Navn, 4) = 'John'
>>>>>
>>>>>Jeg får fejlen: "Unknown column 'Navn' in 'where clause' "
>>>>
>>>> Du kan bruge HAVING:
>>>
>>>Bruger man HAVING som WHERE kan mysqld ikke bruge index'erne.
>>
>> MySQL bruger dog heller ikke indexes på feltnavne inde i funktioner.
>
>Ah, jeg overså funktionskaldet. Men ja, Jimmy gør en brav indsats
>for at besværliggøre MySQL's arbejde

Den enkle løsning vil være:

SELECT CONCAT_WS(' ', Fornavn, Efternavn) AS Navn
FROM test
WHERE Fornavn = 'John'
MVH Martin S

Martin Sveegaard (06-08-2003)
Kommentar
Fra : Martin Sveegaard


Dato : 06-08-03 10:28

On Wed, 6 Aug 2003 11:02:21 +0200, "Jimmy" <nyhedsgruppe@get2net.dk>
wrote:

>PS.: Hvis nogen vil teste dette, kan de afvikle følgende:
>
>CREATE TABLE `test` (
> `Fornavn` varchar(50) NOT NULL default '',
> `Efternavn` varchar(50) NOT NULL default ''
>) TYPE=MyISAM;
>
>
>INSERT INTO `test` VALUES ('John', 'Hansen');

Ja, det går fint!
MVH Martin S

Morten Guldager (06-08-2003)
Kommentar
Fra : Morten Guldager


Dato : 06-08-03 16:53

Wed, 06 Aug 2003 at 09:02 GMT Jimmy wrote
>
> Jeg ønsker at anvende strengfunktioner på kolonner, give resultatet et alias
> og bagefter anvende resultatet i en WHERE-klausul via *aliaserne*.

Det _tror_ jeg ikke du kan.


/Morten

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste