sql >> Database teknologi >  >> RDS >> Mysql

Vælg dynamisk kolonner baseret på kolonneværdi

Du kan prøve at løse det på SQL-siden. Men du skal stadig bruge PHP til at skrive den skøre forespørgsel dynamisk. Eller værre - Du vil skrive programkode i SQL. Mens efterbehandling i PHP er ret simpelt:

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

Det er faktisk tre linjer med ganske simpel kode. Resultatet fra var_export($row) :

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

Som du kan se, er feltet med NULL fjernet.

Endnu bedre:Hold din forespørgsel enkel og vælg bare test2 i stedet for IF(test2 = "myText" , test2, FALSE) AS test2_Alias . Og opret derefter "dynamisk" test2_Alias hvis nødvendigt:

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

Ja - det er kedeligt. Ikke noget fancy. Men du vil elske simpel kode, når du prøver at rette nogle fejl.

Opdater

Fra vores chat:

Forudsat at din "specifikke værdi" er gemt i $specificValue .

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

Det er det. IMHO det er bedre end at udføre to forespørgsler som:

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



  1. django får måned fra dato til sammenlægning

  2. SQL få data ud af BEGIN; ...; ENDE; blok i python

  3. Hvordan laver man afkrydsningsfeltstatus markeret eller umarkeret baseret databaseværdier?

  4. Giver postgres windows systemtilladelse til kopiering (windows 8)