sql >> Databáze >  >> RDS >> Mysql

Dynamicky vybírejte sloupce na základě hodnoty sloupce

Můžete to zkusit vyřešit na straně SQL. K dynamickému psaní toho šíleného dotazu ale stále budete muset použít PHP. Nebo ještě hůř - Programový kód napíšete v SQL. Zatímco postprocessing v PHP je docela jednoduchý:

// $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 jsou ve skutečnosti tři řádky docela jednoduchého kódu. Výsledek z var_export($row) :

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

Jak vidíte, pole s NULL je odstraněno.

Ještě lepší:Váš dotaz bude jednoduchý a stačí vybrat test2 místo IF(test2 = "myText" , test2, FALSE) AS test2_Alias . A pak "dynamicky" vytvořte test2_Alias v případě potřeby:

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

Ano - to je nuda. Nic přepychového. Ale budete milovat jednoduchý kód, když se pokusíte opravit nějaké chyby.

Aktualizovat

Z našeho chatu:

Za předpokladu, že vaše "konkrétní hodnota" je uložena v $specificValue .

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

A je to. IMHO je to lepší než provádět dva dotazy jako:

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



  1. Jednoduchý rekurzivní strom v PHP / MySQL

  2. mysql SQL:konkrétní položka, která má být první, a potom seřadit zbývající položky

  3. Snadný způsob migrace dat z MySql do Derby (JAVADB)?

  4. SELECT v MySQL nefunguje