繁体   English   中英

如何编写以下mySQL查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM