我有以下格式的数据库:
idA | idB | stringValue
----+-----+------------
xyz | 1 | ANDFGFRDFG
xyz | 2 | DTGDFHFGH
xyz | 3 | DFDFDS
abc | 5 | DGDFHHGH
abc | 6 | GG
...
idA和idB 在一起是唯一的。
我有一个文件(list.txt
),其中包含ID对列表,如下所示:
xyz 2
abc 5
abc 6
...
我想在每一行打印stringValue
。请注意,DB中可能缺少文件中的一些ID。在这种情况下,我根本不想打印它们。
简而言之,我想使用文件过滤表格。
答案 0 :(得分:0)
SELECT idA, idB, stringValue FROM table WHERE idA = 'xyz' AND idB = 12;
将为您提供idA等于“xyz”且idB等于12的所有列。
答案 1 :(得分:0)
根据文件中的组合数量,OR子句的数量将是动态的。
您可能需要在
行上创建一个动态创建的查询SELECT * FROM myTable
WHERE
(idA = 'xyz'AND idB = '2')
OR
(idA = 'abc'AND idB = '5')
OR
(idA = 'abc'AND idB = '6')
......
答案 2 :(得分:0)
某些SQL客户端确实提供了允许您直接从文件创建查询或数据的工具。但是我认为更好的方法是为此编写脚本。
根据您最近提出的其他问题,例如this one,或许Perl中的以下解决方案可能对您有所帮助:
use 5.012;
use warnings;
use SQL::Abstract;
my $sql = SQL::Abstract->new;
my @cols = qw/ idA idB stringValue /;
my $where = build_sql_where_from_file( 'list.txt', @cols[0,1] );
my ($query, @bind) = $sql->select(
'yourTable',
\@cols,
$where,
);
sub build_sql_where_from_file {
my $file = shift;
my @build;
open my $fh, '<', $file or die $!;
for my $line (<$fh>) {
chomp $line;
my @fields = split / /, $line;
push @build, {
-and => [
map { $_ => shift @fields } @_,
]
};
}
return \@build;
}
如果我现在使用您的示例list.txt
...
say $query;
say join ":", @bind;
然后我得到:
SELECT idA, idB, stringValue FROM yourTable WHERE ( ( ( idA = ? AND idB = ? ) OR ( idA = ? AND idB = ? ) OR ( idA = ? AND idB = ? ) ) )
xyz:2:abc:5:abc:6
这正是我需要直接插入DBI
查询的内容。
希望有所帮助。
/ I3az /