SQL Server 2014 - получить значение из другой таблицы, если столбец пуст - PullRequest
0 голосов
/ 24 декабря 2018

Допустим, у меня есть настройка таблицы с несколькими значениями, включая имя, идентификатор и внешний ключ, который ссылается на идентификатор другой таблицы.Имя может быть пустым.

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

Какие у меня варианты?

Какой из них лучше между ISNULL и COALESCE?

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Также вы можете попробовать использовать CASE WHEN.

select case when t1.name is not null  then t1.name 
else 
     case when (select t2.name FROM Table2 t2 WHERE ID=t1.my_foreign_id ) is not null 
     then (select t2.name FROM Table2 t2 WHERE ID=t1.my_foreign_id ) else '' end 
end 
from  Table1 t1
0 голосов
/ 27 декабря 2018

Используйте LEFT JOIN, а затем COALESCE значения имени, чтобы учесть нули.Что касается COALESCE против ISNULL, COALESCE является частью стандартов ANSI, что сделает его переносимым на другие СУБД, такие как Oracle и DB2.Вы упомянули, что столбец имени может быть нулевым в обеих таблицах.Если вы хотите подставить дополнительное значение, COALESCE позволит это сделать, тогда как ISNULL принимает только два параметра.Тип данных результата также различен для обеих функций: ISNULL использует тот же тип данных, что и первый параметр, тогда как COALESCE будет использовать тип данных с наивысшим приоритетом.Имейте в виду, что это может привести к ошибкам преобразования, если будет предпринята попытка неявного преобразования типа данных с более низким приоритетом в тип данных с более высоким приоритетом.Типичным примером является попытка преобразовать тип VARCHAR / NVARCHAR в числовой.Список типов данных по приоритету можно найти здесь .

SELECT 
FT.ID,
COALESCE(FT.Name, PT.Name, 'Name Not Listed') as Name
FROM DBO.TableWithFK FT
LEFT JOIN DBO.TableWithPK PT on FT.ID = PT.ID
0 голосов
/ 24 декабря 2018

Вы можете использовать любой из них (ISNULL ИЛИ COLLASCE).

SELECT ISNULL(t1.name, (SELECT ISNULL(t2.name,"") FROM Table2 t2 WHERE ID=t1.my_foreign_id)) AS "name" FROM Table1 t1;  

SELECT COLLASCE(t1.name, (SELECT COLLASCE(t2.name,"") FROM Table2 t2 WHERE ID=t1.my_foreign_id)) AS "name" FROM Table1 t1;  
...