Post

IN 조건에서 여러 값을 사용할 때는 MySQL 문 오류

1
2
3
SELECT cartItems.id, book_id, title, summary, price, quantity FROM cartItems
LEFT JOIN books ON cartItems.book_id = books.id
WHERE user_id = ? AND cartItems.id IN (?)
1
2
-- parameter
[ 2, [ 2, 4 ] ]

원인

나의 경우에는 쿼리에서 (2, 4)로 해석되어야하는데 ([2, 4])로 해석되어 문제가 발생

프로그래밍 언어나 라이브러리에 따라 파라미터를 바인딩하는 방식이 다를 수 있음!

해결

정석의 방식을 사용하여 (?) 에 대응하는 파라미터를 배열로 작성하지 않고, (?,?,?)와 같이 작성하여 개별적으로 처리되도록 설정

1
2
3
4
if (selected) {
  sql += `AND cartItems.id IN (?${",?".repeat(selected.length - 1)})`;
  values.push(...selected);
}

전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const getCartsItems = async (req, res) => {
  const { user_id, selected } = req.body;
  let sql = `SELECT cartItems.id, book_id, title, summary, price, quantity FROM cartItems 
        LEFT JOIN books ON cartItems.book_id = books.id
        WHERE user_id = ? `;
  const values = [user_id];

  if (selected) {
    sql += `AND cartItems.id IN (?${",?".repeat(selected.length - 1)})`;
    values.push(...selected);
  }

  try {
    const { rows, conn } = await getSqlQueryResult(sql, values);
    res.status(StatusCodes.OK).send({ lists: rows });

    conn.release();
  } catch (err) {
    handleServerError(res, err);
  }
};
This post is licensed under CC BY 4.0 by the author.