Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spalten dynamisch basierend auf dem Spaltenwert auswählen

Sie können versuchen, es auf der SQL-Seite zu lösen. Aber Sie müssen immer noch PHP verwenden, um diese verrückte Abfrage dynamisch zu schreiben. Oder noch schlimmer - Sie schreiben Programmcode in SQL. Während die Nachbearbeitung in PHP recht einfach ist:

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

Das sind effektiv drei Zeilen recht einfachen Codes. Das Ergebnis von var_export($row) :

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

Wie Sie sehen, wird das Feld mit NULL entfernt.

Noch besser:Halten Sie Ihre Abfrage einfach und wählen Sie einfach test2 statt IF(test2 = "myText" , test2, FALSE) AS test2_Alias . Und dann "dynamisch" test2_Alias erstellen bei Bedarf:

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

Ja - das ist langweilig. Nichts Besonderes. Aber Sie werden einfachen Code lieben, wenn Sie versuchen, einige Fehler zu beheben.

Aktualisieren

Aus unserem Chat:

Angenommen, Ihr "spezifischer Wert" ist in $specificValue gespeichert .

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

Das ist es. IMHO ist es besser als die Ausführung von zwei Abfragen wie:

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