내가 가진 카드의 카드 혜택이 있는 가맹점 찾기

SELECT distinct COALESCE(b.shop_name, s.name)
FROM card_benefit b
JOIN user_card u ON b.card_name = u.card_name
LEFT JOIN shop s ON b.category = s.category
WHERE
(u.user_id="test1234")
AND
(
(b.shop_name IS NOT NULL)
OR
(b.shop_name IS NULL AND s.category IS NOT NULL)
);
@Override
    public List<String> findAllShopNameByUserId(String userId) {
        QCardBenefit cardBenefit=QCardBenefit.cardBenefit;
        QUserCard userCard=QUserCard.userCard;
        QShop shop=QShop.shop;

        return queryFactory
                .selectDistinct(cardBenefit.shopName.coalesce(shop.name))
                .from(cardBenefit)
                .innerJoin(userCard)
                .on(cardBenefit.card.name.eq(userCard.card.name))
                .leftJoin(shop)
                .on(cardBenefit.category.eq(shop.category))
                .where(
                        userCard.user.id.eq(userId)
                                ~~.and(
                                        cardBenefit.shopName.isNotNull()
                                                .or(
                                                        cardBenefit.shopName.isNull()
                                                         .and(shop.category.isNotNull())
                                                )
                                )~~
                )
                .fetch();
    }