一尘不染

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 * from movies
where title in (
'Scream',
'Scary Movie',
'Exorcist',
'Dracula',
'Saw',
'Hide and Seek'
)

期望的结果是“ WHERE TITLE IN”子句中每个值的记录,其中表中不存在该记录。IE。

'Exorcist'
'Dracula'
'Saw'

阅读 153

收藏
2021-05-30

共1个答案

一尘不染

如果您使用的是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-05-30