Pro86 Ответов: 2

Нужна помощь в SQL запросе


Need help in SQL query - I am trying to add case statement in SQL Inner join after On keyword. My query is as below . But it gives me syntax error

SELECT A.*
FROM 
ABC A
INNER JOIN
XYZ B ON
CASE A.ID WHEN 7 THEN A.name = B.name
ELSE 
	A.surname = B.surname
	END
	AND A.Id = B.Id



Что я уже пробовал:

SELECT A.*
FROM 
ABC A
INNER JOIN
XYZ B ON
CASE A.ID WHEN 7 THEN A.name = B.name
ELSE 
	A.surname = B.surname
	END
	AND A.Id = B.Id

CHill60

Вы получите дополнительную помощь, если включите в свой вопрос примеры данных и то, что вы ожидаете получить в результате для этих образцов данных. Лучшее описание того, что вы пытаетесь сделать, тоже всегда помогает

2 Ответов

Рейтинг:
2

ZurdoDev

Вы не можете сделать это таким образом. Вы можете использовать case, но только с одной стороны от equals. Например:

CASE A.ID WHEN 7 THEN A.name ELSE A.surname END = B.name


Возможно, вы сможете поместить этот случай по обе стороны знака = (2 случая)

Не уверен, что это сработает, а если нет, то вам, вероятно, понадобятся два соединения

CASE A.ID WHEN 7 THEN A.name ELSE A.Surname END = CASE A.ID WHEN 7 THEN B.name ELSE B.surname END


Рейтинг:
17

MadMyche

Как уже говорилось, случай может быть только на одной стороне уравнения. То что вы можете попытаться сделать это попытаться разбить эти условия на И и или пункты вроде этого

SELECT A.*
FROM       ABC A
INNER JOIN XYZ B  ON (A.Id = B.Id)
                 AND (  (A.ID = 7 AND A.name = B.name)
                     OR (A.surname = B.surname)
                 )
Если ты только хотите присоединиться, чтобы на фамилии, когда ИД А. не равна 7, то вы должны использовать этот запрос
SELECT A.*
FROM       ABC A
INNER JOIN XYZ B  ON (A.Id = B.Id)
                 AND (  (A.ID = 7 AND A.name = B.name)
                     OR (A.ID <>7 AND A.surname = B.surname)
                 )


Richard Deeming

Вопрос предполагает, что записи не должны совпадать по фамилии, если ID является 7, так что вам, вероятно, понадобится A.ID != 7 внутри ветви фамилии:

AND 
(
    (A.ID = 7 AND A.name = B.name)
OR
    (A.ID != 7 AND A.surname = B.surname)
)

MadMyche

Я добавил к первоначальному ответу, чтобы отразить это