例如,您有一个只有一列的简单表。IE。
CREATE TABLE movies (title VARCHAR2(255 BYTE))
设置以下数据:
INSERT INTO movies (title) VALUES ('Scream'); INSERT INTO movies (title) VALUES ('Blair Witch'); INSERT INTO movies (title) VALUES ('Friday the 13th'); INSERT INTO movies (title) VALUES ('Scary Movie'); INSERT INTO movies (title) VALUES ('Hide and Seek'); INSERT INTO movies (title) VALUES ('Alien vs Predator');
是否有一个查询或PL / SQL将动态地执行以下操作(即,不必为每个值手动执行“ UNION从双重选择中’尖叫’…”)?
显然,此查询是错误的,但您可以理解:
Select * from movies where title in ( 'Scream', 'Scary Movie', 'Exorcist', 'Dracula', 'Saw', 'Hide and Seek' )
期望的结果是“ WHERE TITLE IN”子句中每个值的记录,其中表中不存在该记录。IE。
'Exorcist' 'Dracula' 'Saw'
如果您使用的是10g或更高版本,则可以构建一个将CSV字符串转换为动态表的函数。
您可以这样使用它:
select * from movies where title NOT in ( select * from table (string_tokenizer ( 'Scream, Scary Movie,Exorcist,Dracula,Saw,Hide and Seek' ) ) ) /
这是一个稍微简单的实现,不需要任何其他基础结构:
SQL> select * from table(sys.dbms_debug_vc2coll('Scream', 'Scary Movie', 'Exorcist', 'Dracula', 'Saw', 'Hide and Seek' )) / 2 3 4 5 6 7 8 COLUMN_VALUE -------------------------------------------------------------------------------- Scream Scary Movie Exorcist Dracula Saw Hide and Seek 6 rows selected. SQL>