admin

sql - 单个查询返回不存在的值

sql

例如,您有一个只有一列的简单表格。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'

阅读 262

收藏
2021-06-07

共1个答案

admin

如果您使用的是 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> 
2021-06-07