例如,您有一个只有一列的简单表格。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 ‘scream’ from dual…”)?
显然这个查询是错误的,但你明白了:
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>