В приведенном выше коде mp3_type
и disk_type
являются подтипами album_type
.Что кажется разумным.Но это означает, что один объект в таблице не может быть одновременно подтипами;поэтому он не может иметь атрибуты обоих подтипов.
Если строка mp3_type
, то обработка ее как disk_type
не приводит к установке атрибутов disk_type
.Когда вы рассматриваете этот объект как disk_type
, эти атрибуты будут - должен быть - нулевым.
insert into albums values (album_type('ABC'));
insert into albums values (mp3_type('BCD', 123));
insert into albums values (disk_type('DEF', 'Vinyl', 1, 12.34, 1.23));
select
t1.albumtitle
from albums t1
where value(t1) IS OF (mp3_type)
and treat(value(t1) as disk_type).mediatype = 'Vinyl'
and treat(value(t1) as disk_type).mediatype = 'Audio CD';
no rows selected
select
t1.albumtitle,
treat(value(t1) as disk_type).mediatype
from albums t1
where value(t1) IS OF (mp3_type);
ALBUMTITLE TREAT(VALU
------------------------------ ----------
BCD
Мне нужно выбрать альбом, который имеет MP3_TYPE и оба значенияMEDIA_TYPE в DISK_TYPE: винил, аудио CD
Если это MP3_TYPE, тогда тип MEDIA равен нулю;но даже с записью disk_type
тип носителя не может быть одновременно винил и CD одновременно.
Возможно, вы просто имели в виду или используете or
вместо and
:
select
t1.albumtitle,
treat(value(t1) as mp3_type).downloadsize as downloadsize,
treat(value(t1) as disk_type).mediatype as mediatype
from albums t1
where
value(t1) IS OF (mp3_type)
or (
value(t1) IS OF (disk_type)
and (
treat(value(t1) as disk_type).mediatype = 'Vinyl'
or treat(value(t1) as disk_type).mediatype = 'Audio CD'
)
);
ALBUMTITLE DOWNLOADSIZE MEDIATYPE
------------------------------ ------------ ----------
BCD 123
DEF Vinyl