Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionner dynamiquement les colonnes en fonction de la valeur de la colonne

Vous pouvez essayer de le résoudre côté SQL. Mais vous aurez toujours besoin d'utiliser PHP pour écrire cette requête folle de manière dynamique. Ou pire - Vous allez écrire du code de programme en SQL. Alors que le post-traitement en PHP est assez simple :

// $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});
    }
}

Ce sont en fait trois lignes de code assez simple. Le résultat de var_export($row) :

stdClass::__set_state(array(
   'field1' => 'value1',
   'field3' => 'value3',
))

Comme vous le voyez, le champ avec NULL est supprimé.

Encore mieux :gardez votre requête simple et sélectionnez simplement test2 au lieu de IF(test2 = "myText" , test2, FALSE) AS test2_Alias . Et puis "dynamiquement" créer test2_Alias si besoin :

if ($row->test2 == 'myText') {
    $row->test2_Alias = $row->test2;
}

Oui - c'est ennuyeux. Rien d'extraordinaire. Mais vous allez adorer le code simple, lorsque vous essayez de corriger certains bugs.

Mettre à jour

Depuis notre chat :

En supposant que votre "valeur spécifique" est stockée dans $specificValue .

$row = DB::('example')->select('test1, test2, test3')->first();
if ($row->test2 != $specificValue) {
    unset($row->test2, $row->test3);
}

C'est ça. À mon humble avis, c'est mieux que d'exécuter deux requêtes comme :

$test2 = DB::('example')->value('test2');
$select = ($test2 == $specificValue) 
    ? 'test1, test2, test3'
    : 'test1';
$row = DB::('example')->select($select)->first();