Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Selecionar colunas dinamicamente com base no valor da coluna


Você pode tentar resolvê-lo no lado do SQL. Mas você ainda precisará usar o PHP para escrever essa consulta maluca dinamicamente. Ou pior - você escreverá o código do programa em SQL. Embora o pós-processamento em PHP seja bastante simples:
// $row = DB::..

$row = (object)[ // result from DB
    'field1' => 'value1',
    'field2' => null,
    'field3' => 'value3'
];

foreach (get_object_vars($row) as $key => $val) {
    if ($val === null) {
        unset($row->{$key});
    }
}

Que são efetivamente três linhas de código bastante simples. O resultado de var_export($row) :
stdClass::__set_state(array(
   'field1' => 'value1',
   'field3' => 'value3',
))

Como você vê, o campo com NULL é removido.

Melhor ainda:mantenha sua consulta simples e selecione test2 em vez de IF(test2 = "myText" , test2, FALSE) AS test2_Alias . E então crie "dinamicamente" test2_Alias se necessário:
if ($row->test2 == 'myText') {
    $row->test2_Alias = $row->test2;
}

Sim - isso é chato. Nada chique. Mas você vai adorar código simples, quando tentar corrigir alguns bugs.

Atualizar


Do nosso bate-papo:

Supondo que seu "valor específico" esteja armazenado em $specificValue .
$row = DB::('example')->select('test1, test2, test3')->first();
if ($row->test2 != $specificValue) {
    unset($row->test2, $row->test3);
}

É isso. IMHO é melhor do que executar duas consultas como:
$test2 = DB::('example')->value('test2');
$select = ($test2 == $specificValue) 
    ? 'test1, test2, test3'
    : 'test1';
$row = DB::('example')->select($select)->first();