SQL读取IN(来自.TXT文件的长列表)

时间:2017-09-27 19:51:18

标签: sql where-clause where-in

我有一个很长的列表,大约有5000多个ID(数字)。

ID
4
5
6
9
10
14
62
63
655
656
657
658
659
661
662

我想知道是否有办法调用从txt文件中读取ID而不是在查询中输入全部5000?

例如

SELECT count(*) from table where ID in (file1.txt)

3 个答案:

答案 0 :(得分:3)

您有几个选项,其中一个选项是我推荐的选项。

选项1

在数据库中创建一个表,如下所示:

create table ID_Comparer (
    ID int primary key
);

使用您选择的编程语言,清空表格,然后加载您希望最终在此表格中查询的5000多个ID。

然后,编写其中一个查询以提取所需的数据:

select *
from main_table m
where exists (
    select 1 from ID_Comparer where ID = m.ID
)

select *
from main_table m
inner join ID_Comparer c on m.ID = c.ID

由于ID_Comparer和(假设)main_table的ID被索引/键入,匹配应该相对较快。

修改了选项1

此选项与上面的选项类似,但对并发性有所帮助。这意味着,如果应用程序1想要比较2000个ID,而应用程序2想要同时将5000个ID与主表进行比较,则您不希望从比较器表中删除数据。所以,稍微改变一下。

create table ID_Comparer (
    ID int primary key,
    token char(32), -- index this
    entered date default current_date() -- use the syntax of your DB
);

然后,使用您喜欢的编程语言来创建GUID。将所有ID和相同的GUID加载到表中,如下所示:

1, 7089e5eced2f408eac8b390d2e891df5
2, 7089e5eced2f408eac8b390d2e891df5
...

执行相同操作的另一个进程是使用GUID加载自己的ID

2412, 96d9d6aa6b8d49ada44af5a99e6edf56
9434, 96d9d6aa6b8d49ada44af5a99e6edf56
...

现在,您的选择:

select *
from main_table m
where exists (
    select 1 from ID_Comparer where ID = m.ID and token = '<your guid>'
)

OR

select *
from main_table m
inner join ID_Comparer c on m.ID = c.ID and token = '<your guid>'

收到您的数据后,请务必执行delete from ID_Comparer where token = '<your guid>' - 这只是很好的清理

您可以创建一个夜间任务,以删除超过2天的所有数据或一些此类额外内务管理。

由于ID_Comparer和(假设)main_table的ID被索引/键入,因此即使GUID是附加的键控查找,匹配也应该相对较快。

选项2

您可以创建一个大型SQL查询,而不是创建表:

select * from main_table where id = <first id>
union select * from main_table where id = <second id>
union select * from main_table where id = <third id>
...

OR

select * from main_table where id IN (<first 5 ids>)
union select * from main_table where id IN (<next 5 ids>)
union select * from main_table where id IN (<next 5 ids>)
...

如果性能可以接受,并且如果您认为选项1中的新表格不适合您,则可以尝试使用其中一种方法。

(假设)main_table的ID被索引/键入,单独匹配可能导致更快的查询,而不是与逗号分隔值的长列表匹配。这是一种猜测。您必须查看查询计划并针对测试用例运行它。

选择哪个选项?

测试这些选项应该很快。我建议您使用数据库引擎和表格的大小来尝试所有这些选项,并查看哪一个最适合您的用例。

答案 1 :(得分:2)

第1步:在sublime或notepad ++中复制所有值 步骤2:按ctrl + h选择“正则表达式”选项 第3步:在每行的末尾添加“,”

在“查找内容”字段中输入$, 和“替换为”字段中的“,”。然后点击“全部替换”。

然后只需复制粘贴SQL查询中的值

SELECT COUNT(*) FROM `admins` WHERE id in (4,
5,
6,
9,
10,
14,
62,
63,
655,
656,
657,
658,
659,
661,
662)

PS:从最后一个值中删除逗号。

答案 2 :(得分:0)

EASY ANSWER(PostgreSQL,Ubuntu 16.04):

假设您有一个表格userdogs,其中包含许多用户及其狗的名字: 用户狗

id    user     dog

您还有一个文件friendsfile.txt,其中有您的朋友的名字。而且您只想从表userdogs中选择您的朋友。

friendsfile.txt

Emily
John
Bill
Charlie
Cameron

1。创建一个新表并从文件中插入内容:

CREATE TABLE friends (name varchar(200));

COPY friends
FROM '/home/friendsfile.txt' 
WITH DELIMITER '~';

如果文件看起来像这样

Emily/John/Bill/Charlie/Cameron

类似的东西应该可以工作(未经测试,我的情况是换行):

COPY friends
FROM '/home/friendsfile.txt' 
WITH DELIMITER('|');

2。

然后您去选择'em:

SELECT DISTINCT  user, dog FROM userdogs 
WHERE (SELECT COUNT(*) 
FROM friends 
WHERE friends.name=userdogs.user)>0;