Синтаксис, необходимый для использования условной переменной для изменения SQL — запроса в Node.JS

#sql #node.js

Вопрос:

Я довольно новичок в NodeJS, и я не уверен в лучшем методе или синтаксисе для создания запроса MS SQL с условным кодом. Вот что я хочу сделать, значительно упростив запрос и используя некоторый псевдокод:

 // @route   GET /api/flow/data/references
async function getDataReferences(req, res) {
  const { station, type } = req.query

  let pool
  try {
    pool = await sql.connect(config)
    const { recordset } = await pool
      .request()
      .input('station', sql.NVarChar(50), station).query`
      SELECT Reference
      FROM TABLE 
      WHERE Status = 'Done' `  
        if(type === 1) {
          `AND Station_1 = @station`
        } else if(type === 2) {
            `AND Station_2 = @station`
        } else {
            `AND Station_3 = @station`
        }
      `AND Process = 5`

    const processedData = recordset.map((item) => item.Reference)

    res.json(processedData)
  } catch (error) {
    console.log(
      `ERROR with Station: ${station} with Type: ${type}`,
      error.message,
      new Date()
    )
    res.status(500).json({ message: error.message })
  } finally {
    await pool.close()
  }
}
 

В зависимости от значения «тип», предоставленного функции, я хочу, чтобы запрос ссылался на другой столбец базы данных.

ОБНОВЛЕНИЕ: Итак, я обнаружил, что следующее работает, хотя, возможно, форматирование не такое приятное.

 // @route   GET /api/flow/data/references
async function getDataReferences(req, res) {
  const { station, type } = req.query
    let station_column
    if(type === 1) {
        station_column = 'AND Station_1 = @station'
      } else if(type === 2) {
        station_column = 'AND Station_2 = @station'
      } else {
        station_column = 'AND Station_3 = @station'
      }

  let query = `
        SELECT Reference
        FROM TABLE 
        WHERE Status = 'Done' 
        ${station_column}
        AND Process = 5`

  let pool
  try {
    pool = await sql.connect(config)
    const { recordset } = await pool
      .request()
      .input('station', sql.NVarChar(50), station).query(query)

    const processedData = recordset.map((item) => item.Reference)

    res.json(processedData)
  } catch (error) {
    console.log(
      `ERROR with Station: ${station} with Type: ${type}`,
      error.message,
      new Date()
    )
    res.status(500).json({ message: error.message })
  } finally {
    await pool.close()
  }
}
 

Я попытался просто использовать подстановки букв шаблона непосредственно в запросе, но это не сработало. (Возможно, по причинам, изложенным здесь: https://github.com/tediousjs/node-mssql#es6-tagged-template-literals )

Если я не получу лучшего ответа, я опубликую это как ответ; но хотел бы знать, есть ли лучший метод для этого.

Комментарии:

1. Вместо вложенного if вы могли бы также использовать переключатель

2. @Luuk — Да, обычно, если есть 4 , если/иначе, я бы использовал переключатель, но на самом деле это не мой вопрос. Я надеялся, что в запросе будет указана логика. (Потому что в более чем 30 строчных запросах с несколькими битами логики все усложняется, если вам нужно следовать переменным, а не в соответствии с SQL.)

Ответ №1:

Похоже, это работает и не слишком сложно:

 // @route   GET /api/flow/data/references
async function getDataReferences(req, res) {
  const { station, type } = req.query
    let station_column
    if(type === 1) {
        station_column = 'AND Station_1 = @station'
      } else if(type === 2) {
        station_column = 'AND Station_2 = @station'
      } else {
        station_column = 'AND Station_3 = @station'
      }

  let query = `
        SELECT Reference
        FROM TABLE 
        WHERE Status = 'Done' 
        ${station_column}
        AND Process = 5`

  let pool
  try {
    pool = await sql.connect(config)
    const { recordset } = await pool
      .request()
      .input('station', sql.NVarChar(50), station).query(query)

    const processedData = recordset.map((item) => item.Reference)

    res.json(processedData)
  } catch (error) {
    console.log(
      `ERROR with Station: ${station} with Type: ${type}`,
      error.message,
      new Date()
    )
    res.status(500).json({ message: error.message })
  } finally {
    await pool.close()
  }
}
 

По сути, заранее создайте полную строку запроса, включая параметры для привязки, а затем извлеките всю эту строку в качестве запроса.