#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()
}
}
По сути, заранее создайте полную строку запроса, включая параметры для привязки, а затем извлеките всю эту строку в качестве запроса.