programing

SELECT 내에서 여러 CASE 콜을 심플화

luckcodes 2023. 1. 31. 21:18

SELECT 내에서 여러 CASE 콜을 심플화

나는 가지고 있다table_a테이블의 기본 키에 대한 두 개의 외부 키가 있습니다.options.

I SELECT에 기반을 둔@_aValue그것들 중 하나에 필적하는 모양options프라이머리 키table_a여기서 멈추면 테이블 a의 각 행에 대해 두 세트의 옵션이 있는 테이블이 나타납니다.프라이머리 키가 다음과 같은 옵션에만 관심이 있습니다.@_aValue이러한 옵션의 세트는 1개뿐입니다만, 그 2개의 값 중 어느 것을 사용하는지는 사전에 알 수 없습니다.table_a이 일과 관련이 있을 거야또한 데이터베이스 내의 모든 행을 순서대로 가져오고 싶기 때문에 두 개의 쿼리가 이상적이지 않게 정렬되어야 한다고 생각합니다.유효한 솔루션을 실장하고 있습니다만, 퍼포먼스가 같기 때문에 매우 비효율적이라고 생각합니다.CASE각 행에 대해 여러 번 비교:

SELECT
    (CASE a.a_id_1 WHEN @_aValue THEN options_a.value_1 ELSE options_b.value_1 END) AS value_1,
    (CASE a.a_id_1 WHEN @_aValue THEN options_a.value_2 ELSE options_b.value_2 END) AS value_2,
    (CASE a.a_id_1 WHEN @_aValue THEN options_a.value_3 ELSE options_b.value_3 END) AS value_3,
FROM table_a AS a
INNER JOIN options AS options_a
    ON a.a_id_1 = options_a.options_id
INNER JOIN connection_details AS details_b
    ON a.a_id_2 = options_b.options_id
WHERE a.a_id_1 = @_aValue
    OR a.a_id_2 = @_aValue;

사실 그런 게 더 많아요.CASE비교하고 있습니다.한 번 비교하고 그에 따라 다음 중 하나의 값을 선택할 수 있는 방법이 있습니까?options_a또는 값options_b이상적인 솔루션이라면 표준 규격에 준거하고 있습니다만, 그것이 불가능할 경우 MySQL과 MariaDB 5.3의 최신 버전에서 동작해야 합니다.

조건부 논리를 없앨 수 없을 것 같아요.하지만, 저는 당신이 질문을 조금 단순화 할 수 있다고 생각합니다.첫 번째 아이디어는LEFT JOIN그리고.COALESCE()

SELECT COALESCE(options_a.value_1, options_b.value_1) AS value_1,
       COALESCE(options_a.value_2, options_b.value_2) AS value_2,
       COALESCE(options_a.value_3, options_b.value_3) AS value_3
FROM table_a a LEFT JOIN
     options options_a
     ON a.a_id_1 = options_a.options_id AND
        a.a_id_1 = @_aValue LEFT JOIN
     connection_details details_b
     ON a.a_id_2 = options_b.options_id AND
        a.a_id_1 <> @_aValue
WHERE @_aValue IN (a.a_id_1, a.a_id_2);

사실, 더 간단한 방법이 있습니다.

SELECT o.value_1, o.value_2, o.value_3 AS value_3
FROM table_a a JOIN
     ((SELECT 'a' as which, oa.options_id, oa.value_1, oa.value_2, oa.value_3
       FROM options_a oa
       WHERE options_id = @_aValue
      ) UNION ALL
      (SELECT 'b' as which, cd.options_id, cd.value_1, cd.value_2, cd.value_3
       FROM connection_details cd
       WHERE options_id <> @_aValue
      )
     ) o
     ON a.a_id_1 = @_aValue or a.a_aid_2 = o.options_id
 WHERE @_aValue IN (a.a_id_1, a.a_id_2);

(그걸 가지고 있는 것 같아.on상태는 맞지만, 조금 걱정이 됩니다.WHERE.)

를 위해union all, 를 사용할 수 있습니다.*두 테이블의 형식이 완전히 동일한 경우.

언급URL : https://stackoverflow.com/questions/27073035/simplifying-multiple-case-calls-inside-select