我赶上了一个奇怪的现象。 这里是,
我们有一个2万条记录,其中MSISDN是字符串类型的,独特的,不为空表。 我要求得到300细节知MSISDN的,因此使用的查询,
select * from table_name
where msisdn in ('msisdn1','msisdn2',......'msisdn300')
但不幸的是上面的查询只返回200计数。 如何找出那些100做无异于在查询给出300的存在呢?
我只能使用选择查询,由于有限的权限。
请指教。
我赶上了一个奇怪的现象。 这里是,
我们有一个2万条记录,其中MSISDN是字符串类型的,独特的,不为空表。 我要求得到300细节知MSISDN的,因此使用的查询,
select * from table_name
where msisdn in ('msisdn1','msisdn2',......'msisdn300')
但不幸的是上面的查询只返回200计数。 如何找出那些100做无异于在查询给出300的存在呢?
我只能使用选择查询,由于有限的权限。
请指教。
我想你要问什么是可能的,但需要一点点努力。
首先,我不相信有什么办法找到一个内有什么物品IN
子句不匹配表中的任何东西。 所以不是我怕你要复制您的查询部分并修改它。
目前,您的查询看起来像
SELECT * FROM my_table WHERE id IN ('id1','id2','id3','id4','id5','id6')
假设没有你MSISDN号码有逗号和/或在他们的单引号,你可以做的是:
IN (...)
查询的一部分, 六个列表id
在我上面的例子将随后成为
',id1,id2,id3,id4,id5,id6,'
所有在一个字符串的ID,我们可以运行一个查询,如下所示:
VARIABLE ids_string VARCHAR2(4000);
EXEC :ids_string := ',id1,id2,id3,id4,id5,id6,';
WITH comma_posns AS (SELECT level AS comma_pos
FROM DUAL
WHERE SUBSTR(:ids_string, level, 1) = ','
CONNECT BY LEVEL <= LENGTH(:ids_string)),
starts_ends AS (SELECT comma_pos AS start_pos,
LEAD(comma_pos, 1, NULL) OVER (ORDER BY comma_pos)
AS end_pos
FROM comma_posns),
ids AS (SELECT SUBSTR(:ids_string, start_pos + 1, end_pos - start_pos - 1)
AS id
FROM starts_ends
WHERE end_pos IS NOT NULL)
SELECT id
FROM ids
WHERE id NOT IN (SELECT id FROM my_table);
我把ID列表中命名绑定变量:ids_string
这样我就可以在整个查询是指它多次。
该comma_posns
子查询列出所有逗号出现在字符串中的位置。 starts_ends
然后重新排列到这一点对逗号位置,然后ids
使用这些开始和结束位置挑出来的ID字符串。 最后,我们选择所有在这个字符串,但没有在表中的ID。
我使用下面的示例数据跑上述查询:
SQL> select id from my_table; ID -------------------- id1 id1a id4 id6
当我运行此查询,我得到了以下结果:
ID -------------------------------------------------------------------------------- id2 id3 id5
如果您的ID字符串是特别长(即超过4000个字符的价值),你可能要它分割成4000个或者更少的字符长的部分。
你可以建立一个“虚拟”的表,你正在寻找的ID,然后做外连接上与您的实际表。
with to_search as (
select 'msisdn1' as msisdn from dual
union all
select 'msisdn1' from dual
union all
select 'msisdn2' from dual
union all
select 'msisdn2' from dual
...
(you get the picture)
...
select 'msisdn3000' from dual
)
SELECT s.msisdn,
nvl(mt.msisdn, 'not found')
FROM to_search s
LEFT JOIN my_table mt ON mt.msisdn = s.msisdn
对于不存在于所有的ID my_table
你会看到一个“未找到”
首先的MSISDN是一个主键(唯一+不为空),所以没有机会是零。
你叫使用以下查询,
选择从表名*其中MSISDN是不是空的限制300;