Left Outer Join, только если столбец существует (сервер SQL)
Я использую SQL Server Express и пытаюсь извлечь разные столбцы из разных таблиц, используя LEFT OUTER JOIN
, Это прекрасно работает, но только если существуют все столбцы. В течение последнего часа я читал, как добавить условие, чтобы LEFT OUTER JOIN
делается только если столбец существует.
Смотрите код ниже (проблема является последней LEFT OUTER JOIN
так как a.[Page Path]
не существует):
SELECT
b.[Page ID],
ISNULL(b.[Page Group],'Other Landing Page') AS [Landing Page Group],
ISNULL(c.[Page Group],'Other Second Page') AS [Second Page Group],
ISNULL(d.[Page Group],'Other Page') AS [Page Path Group],
a.*
FROM [mychoice-data-b9BwZvd] a
LEFT OUTER JOIN [mychoice-pagedims] b
ON
(a.[Landing Page Path] LIKE b.[Page ID])
LEFT OUTER JOIN [mychoice-pagedims] c
ON
(a.[Second Page Path] LIKE c.[Page ID])
LEFT OUTER JOIN [mychoice-pagedims] d
ON
a.[Page Path] LIKE d.[Page ID]
WHERE a.[Page Path] IS NOT NULL
я пробовал IF(EXISTS
, но что бы я ни делал, я получаю сообщение об ошибке "Неверное имя столбца" Путь к странице "".
3 ответа
Я не думаю, что вы можете сделать это в одном запросе, способ, который я предлагаю вам использовать, что-то вроде этого:
if (
select COUNT(*)
from sys.objects so
inner join sys.columns col
on so.object_id = col.object_id
where so.type = 'U' and so.name = 'tablename' and col.name = 'colname'
) > 0
-- column exists -> write select with the join
else
-- column does not exist, don't include the join
Нет, это невозможно. Схема базы данных не должна меняться у вас под рукой, поэтому приложение должно знать об этом и только те таблицы и столбцы, которые существуют.
Если это вообще возможно, вам следует изменить схему базы данных, чтобы таблицы, для которых необходимо выполнить запрос, не отличались незначительно или даже лучше, чтобы вам вообще не нужно было выполнять его для нескольких таблиц. Вероятно, путем объединения информации в одной таблице со столбцом, указывающим на ее происхождение.
Используйте динамический SQL
DECLARE
@SQL VARCHAR(MAX)='
SELECT
b.[Page ID],
ISNULL(b.[Page Group],''Other Landing Page'') AS [Landing Page Group],
ISNULL(c.[Page Group],''Other Second PAGE'') AS [Second Page Group],
ISNULL(d.[Page Group],''Other Page'') AS [Page Path Group],
a.*
FROM [mychoice-data-b9BwZvd] a
LEFT OUTER JOIN [mychoice-pagedims] b
ON
(a.[Landing Page Path] LIKE b.[Page ID])
LEFT OUTER JOIN [mychoice-pagedims] c
ON
(a.[Second Page Path] LIKE c.[Page ID])
LEFT OUTER JOIN [mychoice-pagedims] d
ON
'+
CASE
WHEN EXISTS (
SELECT *
FROM sys.columns C
JOIN sys.tables T ON T.object_id = C.object_id
LEFT JOIN sys.schemas S ON S.Schema_id=T.Schema_id
WHERE
C.Name ='Page Path' AND
T.Name ='mychoice-pagedims'
)
THEN 'a.[Page Path] LIKE d.[Page ID]'
ELSE '(1=0)'
END+'
WHERE a.[Page Path] IS NOT NULL
'
EXEC(@SQL)