Недопустимое имя столбца в объединении столбцов с Laravel 4 Красноречиво?


Итак, я хочу подготовить список для размещения в выпадающем списке с помощью laravel, и я хотел использовать объединение, чтобы объединить значения 3 столбцов, и я могу добиться этого с помощью этого

public function deviList() {
        return Device::select(DB::raw('CONCAT(DESC, OS, OS_V) AS FullDesc'), 'DEVI_ID')                        
                        ->where('STATUS', 2)
                        ->orderBy('DESC')
                        ->lists('FullDesc', 'DEVI_ID');
    }

Однако было бы лучше иметь пробел или косую черту, разделяющую значения столбцов, поэтому я сделал это так, как некоторые люди рекомендовали в некоторых других местах:

public function deviList() {
        return Device::select(DB::raw('CONCAT(DESC," ",OS," ",OS_V) AS FullDesc'), 'DEVI_ID')                        
                        ->where('STATUS', 2)
                        ->orderBy('DESC')
                        ->lists('FullDesc', 'DEVI_ID');
    }

Однако я получаю сообщение об ошибке SQLSTATE[42S22]: [Microsoft][Драйвер ODBC 11 для SQL Server] [SQL Server] Недопустимое имя столбца '' (Таким образом, я предполагаю, что в отличие от примеров, приведенных в других местах, эти разделения читаются так, как если бы они были столбцами?) Так как же я могу соединиться с каким-то разделением?

Author: Micael Florêncio, 2015-01-23

2 answers

Если на вашем SQL-сервере включен параметр QUOTED_IDENTIFIER, то для идентификации объектов будут использоваться двойные кавычки, а не строковые литералы. В этом случае " " не будет строкой, представляющей пробел, это будет объект (столбец), представленный пробелом, которого не существует.

Попробуйте переключить кавычки в вашей инструкции SQL:

public function deviList() {
    return Device::select(DB::raw("CONCAT(DESC,' ',OS,' ',OS_V) AS FullDesc"), 'DEVI_ID')                        
        ->where('STATUS', 2)
        ->orderBy('DESC')
        ->lists('FullDesc', 'DEVI_ID');
}

QUOTED_IDENTIFIER документы здесь.

 4
Author: patricus, 2015-01-23 21:02:52

Прошло некоторое время с тех пор, как я работал с SQL Server, но, насколько я помню, функция CONCAT недоступна. Вместо этого вы используете что-то вроде этого:

SELECT (COALESCE(col1, '') + '' + COALESCE(col2, '')) AS col3 FROM ...

Я думаю, вы можете использовать это как таковое, если ваш запрос:

public function deviList() {
  return Device::select(DB::raw('(COALESCE(DESC, "") + " " + COALESCE(OS, "") + " " (COALESCE(OS_V, "")) AS FullDesc'), 'DEVI_ID')                        
    ->where('STATUS', 2)
    ->orderBy('DESC')
    ->lists('FullDesc', 'DEVI_ID');
}

К сожалению, у меня нет возможности проверить это, но то, что он должен сделать, это с помощью COALESCE() проверить, является ли столбец нулевым, прежде чем объединять его с пробелом между ними, а затем псевдонимировать его как FullDesc для использования позже.

Надеюсь, это сработает.

 0
Author: Tim Lewis, 2015-01-23 16:44:51