반응형
MySQL에서 선택한 문자열에 열 데이터와 함께 바꾸기를 사용하면 다른 행에 대해 동일한 출력이 생성됩니다.
다음은 문제를 가장 잘 보여주는 간단한 작업 버전입니다.내 데이터베이스는 다음과 같습니다.
사용자 테이블:
user_id | 이름 |
---|---|
1 | 밥. |
2 | 데이브 |
3 | 스티븐 |
설정 테이블:
이름. | 가치 |
---|---|
format_string | {first_name}님 안녕하세요! |
여기서 모든 사용자의 사용자 데이터를 삽입한 format_string을 가져옵니다.format_string을 다음과 같이 SQL에 하드코드하면 동작합니다.
SELECT first_name,
REPLACE(
"Hello {first_name}!",
"{first_name}",
first_name
)
AS greeting
FROM users
다음과 같은 출력이 표시됩니다.
이름 | 인사 |
---|---|
밥. | 안녕 밥! |
데이브 | 안녕하세요 데이브! |
스티븐 | 안녕하세요 스티븐! |
단, 설정 테이블에서 format_string을 사용하면 다음과 같이 됩니다.
SELECT first_name,
REPLACE(
(SELECT value FROM settings WHERE name = "format_string"),
"{first_name}",
first_name
)
AS greeting
FROM users
이 출력은 전혀 예상하지 못한 것입니다.
이름 | 인사 |
---|---|
밥. | 안녕 밥! |
데이브 | 안녕 밥! |
스티븐 | 안녕 밥! |
문제가 무엇인지, 어떻게 해결해야 하는지 아는 사람 있나요?
나는 무엇이 문제인지 설명할 수 없다.데이터베이스 엔진에서 버그가 발견되었을 수 있습니다.새로운 MariaDB(dbfiddle의 새로운 버전은 고장난 것처럼 보이지만 MariaDB 10.3과 MySQL 5.5 둘 다 출력을 제공하는 것 같습니다만, MySQL 5.6은 예상한 결과를 제공하므로 버그가 발견되어 수정되었습니다.
서브쿼리가 아닌 join을 사용하여 쿼리를 다시 쓰는 것은 모든 엔진에서 동작하는 것처럼 보입니다.
SELECT REPLACE(settings.value, "{first_name}", users.first_name) as greeting
FROM
users,
settings
WHERE settings.name = 'format_string';
- dbfiddle for MariaDB 10.3 (이상)
- MySQL 5.5용 dbfiddle(이상)
- MySQL 5.6용 dbfiddle (OK)
언급URL : https://stackoverflow.com/questions/72891619/using-replace-on-a-string-from-select-in-mysql-with-column-data-leads-to-same-ou
반응형
'itsource' 카테고리의 다른 글
SQL과 MySQL의 차이점은 무엇입니까? (0) | 2022.11.05 |
---|---|
키를 누르려면 어떻게 기다려야 하나요? (0) | 2022.11.04 |
Form Data 검사 방법 (0) | 2022.11.04 |
PHP 구문 분석/구문 오류 및 해결 방법 (0) | 2022.11.04 |
이 간단한 PDO 준비 문구가 작동하지 않는 이유는 무엇입니까? (0) | 2022.11.04 |