Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybierz dynamicznie kolumny na podstawie wartości kolumny

Możesz spróbować rozwiązać go po stronie SQL. Ale nadal będziesz musiał używać PHP do dynamicznego pisania tego szalonego zapytania. Albo gorzej - będziesz pisać kod programu w SQL. Podczas gdy przetwarzanie końcowe w PHP jest dość proste:

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

To są właściwie trzy linijki dość prostego kodu. Wynik z var_export($row) :

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

Jak widzisz, pole z NULL jest usuwane.

Jeszcze lepiej:zachowaj prostotę zapytania i wybierz test2 zamiast IF(test2 = "myText" , test2, FALSE) AS test2_Alias . A następnie „dynamicznie” utwórz test2_Alias w razie potrzeby:

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

Tak - to nudne. Nic fajnego. Ale pokochasz prosty kod, gdy spróbujesz naprawić niektóre błędy.

Aktualizacja

Z naszego czatu:

Zakładając, że Twoja „określona wartość” jest przechowywana w $specificValue .

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

Otóż ​​to. IMHO to lepsze niż wykonywanie dwóch zapytań typu:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak stworzyć tabelę relacji w MySQL?

  2. Problem z kodowaniem znaków

  3. Wyliczanie kombinacji za pomocą SQL

  4. Czy możesz zwiększyć max_allowed_packet od klienta?

  5. Zapytanie o wybór między serwerami MySQL