[英]How do I write the following mySQL query?
我有以下格式的數據庫:
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
打印它。 請注意,數據庫中可能缺少文件中的一些ID對。 在那種情況下,我根本不想打印它們。
簡而言之,我想使用文件過濾表。
SELECT idA, idB, stringValue FROM table WHERE idA = 'xyz' AND idB = 12;
將為您提供idA等於“ xyz”而idB等於12的所有列。
OR子句的數量將根據文件中組合的數量而動態變化。
您可能需要根據以下內容使它成為動態創建的查詢
SELECT * FROM myTable
WHERE
(idA = 'xyz'AND idB = '2')
OR
(idA = 'abc'AND idB = '5')
OR
(idA = 'abc'AND idB = '6')
......
某些SQL客戶端確實提供了使您可以直接從文件創建查詢或數據的功能。 但是我相信更好的方法是為此編寫一個腳本。
根據您最近像這樣提出的其他問題,那么也許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 /
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.