>Description:
i got wrong values from a select statement using a
case value when .. then .. else .. end instruction
i made a select statement from this two tables
corriere
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| ID | tinyint(3) unsigned | | PRI | NULL | auto_increment |
| sigla | char(20) | | | | |
| id | sigla |
+----+--------------------+
| 1 | Executive |
| 2 | TNT Global Express |
| 3 | Borghi |
| 4 | DHL |
upacco
| Field | Type | Null | Key |
Default | Extra |
+---------------+-------------------------------------------+------+-----+--
-------+----------------+
| id | mediumint(8) unsigned | | PRI |
NULL | auto_increment |
| rif_ddt | varchar(20) | YES | |
NULL | |
| qty | smallint(5) unsigned | | | 0
| |
| addr_shipp | smallint(5) unsigned | | | 0
| |
| awb | varchar(20) | YES | |
NULL | |
| id_corriere | tinyint(3) unsigned | YES | |
NULL | |
| pack_details | varchar(20) | YES | |
NULL | |
| data_consegna | date | YES | |
NULL | |
| status | enum('APERTO','REC','SH-W','SH-C','SH-L') | | |
APERTO | |
| id | rif_ddt | qty | addr_shipp | awb | id_corriere | pack_details |
data_consegna | status |
+----+---------+-----+------------+----------+-------------+--------------+-
--------------+--------+
| 12 | gf | 0 | 29 | pacco 12 | 3 | asdf |
2002-06-07 | APERTO |
| 16 | ddt8 | 1 | 9 | pacco 16 | 3 | asdf |
2002-06-10 | SH-C |
| 17 | NULL | 3 | 24 | pacco 17 | 2 | xyz |
NULL | REC |
| 18 | NULL | 0 | 33 | pacco 18 | 3 | asdf |
NULL | APERTO |
| 19 | NULL | 0 | 5 | NULL | NULL | NULL |
NULL | APERTO |
| 20 | NULL | 4 | 24 | NULL | NULL | NULL |
NULL | REC |
| 21 | NULL | 1 | 50 | NULL | NULL | NULL |
NULL | APERTO |
| 22 | ddt8 | 4 | 23 | pacco 22 | 3 | pacco 22 |
2002-06-10 | SH-C |
| 23 | NULL | 0 | 24 | NULL | NULL | NULL |
NULL | APERTO |
| 24 | NULL | 0 | 24 | NULL | NULL | NULL |
NULL | APERTO |
this select statement retrives wrong values in field status:
SELECT DISTINCT up.id as id,IFNULL(up.awb,'') as awb
,IF(up.id_corriere,c.sigla,'') as corriere
,IFNULL(up.pack_details,'') as pack_details
,up.data_consegna as data_consegna
,(CASE up.status
WHEN 'REC' THEN 'CHIUSO'
WHEN 'SH-W' THEN 'FERMO'
WHEN 'SH-C' THEN 'SPEDITO'
WHEN 'SH-L' THEN 'SPEDITO'
ELSE up.status END) as status
FROM upacco up, corriere c
WHERE (c.id = up.id_corriere or up.id_corriere IS NULL)
AND (up.rif_ddt='ddt8' OR up.rif_ddt IS NULL)
ORDER BY up.rif_ddt,up.id;
| id | awb | corriere | pack_details | data_consegna | status
| expected value is
+----+----------+--------------------+--------------+---------------+-------
-+
| 17 | pacco 17 | TNT Global Express | xyz | NULL | APERTO
| <- CHIUSO
| 18 | pacco 18 | Borghi | asdf | NULL | APERTO
|
| 19 | | | | NULL | APERTO
|
| 20 | | | | NULL | APERTO
| <- CHIUSO
| 21 | | | | NULL | APERTO
|
| 23 | | | | NULL | APERTO
|
| 24 | | | | NULL | APERTO
|
| 16 | pacco 16 | Borghi | asdf | 2002-06-10 | APERTO
| <- SPEDITO
| 22 | pacco 22 | Borghi | pacco 22 | 2002-06-10 | APERTO
| <- SPEDITO
her i removed the case statement to se what is the real value an it's ok
SELECT DISTINCT up.id as id,IFNULL(up.awb,'') as awb
,IF(up.id_corriere,c.sigla,'') as corriere
,IFNULL(up.pack_details,'') as pack_details
,up.data_consegna as data_consegna
,up.status as status
FROM upacco up, corriere c
WHERE (c.id = up.id_corriere or up.id_corriere IS NULL)
AND (up.rif_ddt='ddt8' OR up.rif_ddt IS NULL)
ORDER BY up.rif_ddt,up.id;
| id | awb | corriere | pack_details | data_consegna | status
|
+----+----------+--------------------+--------------+---------------+-------
-+
| 17 | pacco 17 | TNT Global Express | xyz | NULL | REC
|
| 18 | pacco 18 | Borghi | asdf | NULL | APERTO
|
| 19 | | | | NULL | APERTO
|
| 20 | | | | NULL | REC
|
| 21 | | | | NULL | APERTO
|
| 23 | | | | NULL | APERTO
|
| 24 | | | | NULL | APERTO
|
| 16 | pacco 16 | Borghi | asdf | 2002-06-10 | SH-C
|
| 22 | pacco 22 | Borghi | pacco 22 | 2002-06-10 | SH-C
|
i use also other statements with to tables and exactly the same case
instruction
and it works well for example
SELECT up.id as 'N�Pacco'
,IFNULL(up.rif_ddt,'') as rif_ddt
,(CASE up.status
WHEN 'REC' THEN 'CHIUSO'
WHEN 'SH-W' THEN 'FERMO'
WHEN 'SH-C' THEN 'SPEDITO'
WHEN 'SH-L' THEN 'SPEDITO'
ELSE up.status END) as status
,ind.nome as Destinazione
FROM upacco up, indirizzi ind
WHERE up.status in ('REC','SH-W','SH-C','SH-L')
AND ind.id = up.addr_shipp
AND (up.rif_ddt='ddt8' OR up.rif_ddt IS NULL)
ORDER BY up.rif_ddt,up.id;
| N�Pacco | rif_ddt | status | Destinazione |
+---------+---------+---------+--------------+
| 17 | | CHIUSO | ALPITEL |
| 20 | | CHIUSO | ALPITEL |
| 16 | ddt8 | SPEDITO | WIND |
| 22 | ddt8 | SPEDITO | SIRTI MI |
table indirizzi is made like this
| Field | Type | Null | Key | Default | Extra
|
+--------------+-----------------------+------+-----+---------+-------------
---+
| id | mediumint(8) unsigned | | PRI | NULL |
auto_increment |
| nome | varchar(50) | | | |
|
>How-To-Repeat:
CREATE TABLE upacco (
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
rif_ddt CHAR(20) NULL,
qty SMALLINT UNSIGNED NOT NULL,
addr_shipp SMALLINT UNSIGNED NOT NULL,
awb VARCHAR(15) NULL,
id_corriere TINYINT UNSIGNED NULL,
pack_details VARCHAR(20) NULL,
data_consegna DATE NULL,
status enum('APERTO','REC','SH-W','SH-C','SH-L') NOT NULL,
PRIMARY KEY (id) );
INSERT INTO upacco
VALUES
(12,'gf',0,29,'pacco 12',3,'asdf','2002-06-07','APERTO')
,(16,'ddt8',1, 9,'pacco 16',3,'asdf','2002-06-10','SH-C')
,(17,NULL,3,24,'pacco 17',2,'xyz','NULL','REC')
,(18,NULL,0,33,'pacco 18',3,'asdf','NULL','APERTO')
,(19,NULL,0,5,NULL,NULL,NULL,NULL,'APERTO')
,(20,NULL,4,24,NULL,NULL,NULL,NULL,'REC')
,(21,NULL,1,50,NULL,NULL,NULL,NULL,'APERTO')
,(22,'ddt8',4,23,'pacco 22',3,'pacco 22','2002-06-10','SH-C')
,(23,NULL,0,24,NULL,NULL,NULL,NULL,'APERTO')
,(24,NULL,0,24,NULL,NULL,NULL,NULL,'APERTO');
CREATE TABLE corriere (
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
sigla CHAR(20) NOT NULL,
PRIMARY KEY (id) );
INSERT INTO corriere
VALUES
(1,'Executive')
,(2,'TNT Global Express')
,(3,'Borghi')
,(4,'DHL');
SELECT DISTINCT up.id as id,IFNULL(up.awb,'') as awb
,IF(up.id_corriere,c.sigla,'') as corriere
,IFNULL(up.pack_details,'') as pack_details
,up.data_consegna as data_consegna
,(CASE up.status
WHEN 'REC' THEN 'CHIUSO'
WHEN 'SH-W' THEN 'FERMO'
WHEN 'SH-C' THEN 'SPEDITO'
WHEN 'SH-L' THEN 'SPEDITO'
ELSE up.status END) as status
FROM upacco up, corriere c
WHERE (c.id = up.id_corriere or up.id_corriere IS NULL)
AND (up.rif_ddt='ddt8' OR up.rif_ddt IS NULL)
ORDER BY up.rif_ddt,up.id;
SELECT DISTINCT up.id as id,IFNULL(up.awb,'') as awb
,IF(up.id_corriere,c.sigla,'') as corriere
,IFNULL(up.pack_details,'') as pack_details
,up.data_consegna as data_consegna
,up.status as status
FROM upacco up, corriere c
WHERE (c.id = up.id_corriere or up.id_corriere IS NULL)
AND (up.rif_ddt='ddt8' OR up.rif_ddt IS NULL)
ORDER BY up.rif_ddt,up.id;
>Originator: Ulrich schmid
>Organization: Videoelettronic S.P.A Italy
>mySQL supporT: none
>Severity: non-critical
>Priority: medium
>Category: mysql
>Class: sw-Bug
>Release: mysql-3.23.32 (Source distribution)
System: Linux linuxgw 2.2.17-21mdksecure #1 SMP Thu Oct 5 12:52:38 CEST 2000
i686 unknown
Architecture: i686
Some paths: /usr/bin/perl /usr/bin/make /usr/bin/gmake /usr/bin/gcc
/usr/bin/cc
GCC: Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux/2.95.3/specs
gcc version 2.95.3 19991030 (prerelease)
Compilation info: CC='gcc' CFLAGS='' CXX='c++' CXXFLAGS='' LDFLAGS=''
Configure command: ./configure --prefix=/usr/local/mysql
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php