sql >> データベース >  >> RDS >> Mysql

列の値に基づいて列を動的に選択する

    あなたはSQL側でそれを解決することを試みることができます。ただし、そのクレイジーなクエリを動的に作成するには、PHPを使用する必要があります。さらに悪いことに、SQLでプログラムコードを記述します。 PHPでの後処理は非常に簡単ですが、

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

    これは事実上、3行の非常に単純なコードです。 var_export($row)の結果 :

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

    ご覧のとおり、NULLのフィールドは削除されています。

    さらに良い方法:クエリをシンプルに保ち、test2を選択するだけです IF(test2 = "myText" , test2, FALSE) AS test2_Aliasの代わりに 。次に、「動的に」test2_Aliasを作成します 必要に応じて:

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

    はい-それは退屈です。特別なことは何もありません。しかし、いくつかのバグを修正しようとすると、単純なコードが気に入るはずです。

    更新

    チャットから:

    「特定の値」が$specificValueに保存されていると仮定します 。

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

    それでおしまい。私見では、次のような2つのクエリを実行するよりも優れています。

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



    1. mysqlで無制限に3番目に高い給与を見つける

    2. MySQLテーブルが最後に更新されたのはいつですか?

    3. pdoを使用して行IDをフェッチできません

    4. アクセス255列の制限の回避策