sql >> Database >  >> RDS >> Mysql

Dynamisch kolommen selecteren op basis van kolomwaarde

U kunt proberen het aan de SQL-kant op te lossen. Maar je zult nog steeds PHP moeten gebruiken om die gekke query dynamisch te schrijven. Of erger nog:u schrijft programmacode in SQL. Hoewel postverwerking in PHP vrij eenvoudig is:

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

Dat zijn in feite drie regels vrij eenvoudige code. Het resultaat van var_export($row) :

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

Zoals je ziet, is het veld met NULL verwijderd.

Nog beter:houd uw vraag eenvoudig en selecteer gewoon test2 in plaats van IF(test2 = "myText" , test2, FALSE) AS test2_Alias . En maak vervolgens "dynamisch" test2_Alias indien nodig:

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

Ja - dat is saai. Niets bijzonders. Maar je zult dol zijn op eenvoudige code als je een paar bugs probeert op te lossen.

Bijwerken

Uit onze chat:

Ervan uitgaande dat uw "specifieke waarde" is opgeslagen in $specificValue .

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

Dat is het. IMHO is het beter dan het uitvoeren van twee zoekopdrachten zoals:

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



  1. ResultSet.getString(Date) verschilt per stuurprogramma

  2. Hoe verwijder ik enkele aanhalingstekens uit een tabel in postgresql?

  3. Hoe INSTR() werkt in MariaDB

  4. Selecteer een record alleen als de vorige een lagere waarde heeft