sql >> Databasteknik >  >> RDS >> Mysql

Välj dynamiskt kolumner baserat på kolumnvärde

Du kan försöka lösa det på SQL-sidan. Men du kommer fortfarande att behöva använda PHP för att skriva den där galna frågan dynamiskt. Eller ännu värre - Du kommer att skriva programkod i SQL. Även om efterbehandling i PHP är ganska enkel:

// $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 är faktiskt tre rader med ganska enkel kod. Resultatet från var_export($row) :

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

Som du ser tas fältet med NULL bort.

Ännu bättre:håll din fråga enkel och välj bara test2 istället för IF(test2 = "myText" , test2, FALSE) AS test2_Alias . Och skapa sedan "dynamiskt" test2_Alias om det behövs:

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

Ja - det är tråkigt. Inget märkvärdigt. Men du kommer att älska enkel kod när du försöker fixa några buggar.

Uppdatera

Från vår chatt:

Förutsatt att ditt "specifika värde" är lagrat i $specificValue .

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

Det är allt. IMHO det är bättre än att köra två frågor som:

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



  1. Hur man hittar intervallet mellan två datum i PostgreSQL

  2. Kör en lagrad procedur från crontab

  3. Hur man automatiserar SQL-databasunderhållsuppgifter med SQLCMD

  4. Tillåten minnesstorlek på 134217728 byte är slut (försökte allokera 42 byte)