我有一个很长的列表,大约有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)
答案 0 :(得分:3)
您有几个选项,其中一个选项是我推荐的选项。
在数据库中创建一个表,如下所示:
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想要比较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是附加的键控查找,匹配也应该相对较快。
您可以创建一个大型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)
假设您有一个表格userdogs
,其中包含许多用户及其狗的名字:
用户狗:
id user dog
您还有一个文件friendsfile.txt
,其中有您的朋友的名字。而且您只想从表userdogs
中选择您的朋友。
friendsfile.txt :
Emily
John
Bill
Charlie
Cameron
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('|');
然后您去选择'em:
SELECT DISTINCT user, dog FROM userdogs
WHERE (SELECT COUNT(*)
FROM friends
WHERE friends.name=userdogs.user)>0;