itsource

MySQL에서 선택한 문자열에 열 데이터와 함께 바꾸기를 사용하면 다른 행에 대해 동일한 출력이 생성됩니다.

mycopycode 2022. 11. 4. 21:34
반응형

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';

언급URL : https://stackoverflow.com/questions/72891619/using-replace-on-a-string-from-select-in-mysql-with-column-data-leads-to-same-ou

반응형