簡體   English   中英

在單獨的表中從鍵/值對中選擇不同的值

[英]Selecting distinct values from key/value pairs in a seperate table

我有2個數據庫表

JOBS(JOB_ID, JOB_TIME, JOB_NAME,...), JOB_PARAMETERS(JOB_ID,NAME,VALUE)

其中JOB_PARAMETERS本質上是一個包含作業參數鍵值對的映射。 每個作業可能具有唯一的參數鍵/值對。

我期待以實用的方式構建一個查詢,該查詢將返回包含鍵/值組合的不同作業ID。 其中值實際上是值列表,比較運算符。 例如:

JOB_PARAMETERS: NAME = 'OUTPUT_FILENAME', VALUE LIKE "ALEX%", "JAX%"
                NAME = 'PRIORITY' , VALUE > 7

上面的示例將自動過濾掉所有沒有OUTPUT_FILENAME和PRIORITY鍵的作業。 返回滿足這兩個條件的所有工作。

我還需要能夠支持分頁和排序。

我計划將Perl與DBIx :: Class一起使用,但我也可以在純Perl / SQL中使用它。

我願意改變數據庫模式,但每個作業都可以有不同的鍵/值對,所以我不能只在job表中創建它們。

提前致謝。

可以在SQL中執行此操作,方法是將JOB_PARAMETERSJOB_ID分組並相應地過濾組。 例如,如果(JOB_ID, NAME)存在唯一性約束,則可以按如下方式進行查詢:

SELECT   JOB_ID
FROM     JOB_PARAMETERS
WHERE    (NAME='OUTPUT_FILENAME' AND (VALUE LIKE 'ALEX%' OR VALUE LIKE 'JAX%'))
      OR (NAME='PRIORITY' AND VALUE > 7)
GROUP BY JOB_ID
HAVING   COUNT(*) = 2

如果沒有這樣的唯一性約束,則必須用COUNT(DISTINCT NAME)替換COUNT(*) COUNT(DISTINCT NAME)

使用DBIx :: Class時,可以使用Schema :: Loader生成DBIC模式。

連接到數據庫后,您將獲得一個$ schema對象,您可以使用該對象來過濾ResultSet以返回所需的Result對象:

my $rs_job_parameters = $schema->resultset('Job_Parameters')->search({
    -or => [
        {
            'name' => 'OUTPUT_FILENAME',
            'value' => [{ like => 'ALEX%'}, { like => 'JAX%' }].
        },
        {
            'name' => 'PRIORITY',
            'value' => [{ '>' => 7}].
        }
    ]},
    {
        columns  => [qw( job_id )],
        group_by => [qw( job_id )], # alternative you can use distinct => 1 to group_by all selected columns
        having   => \[ 'COUNT(*) = ?', [ 2 ] ],
    }
);

my @job_ids = $rs_job_parameters->get_column('job_id')->all;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM