Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обрaботать NULL в подзапросе, подскажите пожалуйста / 12 сообщений из 12, страница 1 из 1
11.06.2018, 16:47
    #39659479
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
Добрый день!

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

Сама схема таблиц такая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
--таблица изделий
declare @Subjects table([Name] varchar(10), id int)
insert into @Subjects(name, id)
select 'Шкаф1', 1 union all
select 'Шкаф2', 2 union all
select 'Шкаф3', 3  

--таблица мастеров
declare @Creators table(ID int, [Name] nvarchar(10))
insert into @Creators(ID, [Name])
select 1, 'Ivanov' union all
select 2, 'Petrov' union all
select 3, 'Sidorov'

--таблица связей
declare @Relations table(SubjectID int, CreatorID int, Comment nvarchar(10))
insert into @Relations(SubjectID, CreatorID, Comment)
select 1, 1, 'Хорошо' union all
select 1, 2, NULL union all
select 2, 2, 'Хорошо' union all
select 3, 2, 'Недодел' union all
select 2, 3, NULL 

--нужно получить все изделия конкретного мастера (CreatorID=2) с комментариями. В этом поле Comment могут быт NULL 
SELECT s.[Name], 
	(select rel.Comment as 'data()' 
		FROM @Subjects AS s2 INNER JOIN @Relations as rel ON s2.ID = rel.SubjectID AND rel.[CreatorID] = 2 
		WHERE s.id = s2.id order by rel.[CreatorID] for xml path(''))
	FROM @Subjects s 



в итоге, я получаю такие данные:
Код: plaintext
1.
2.
Шкаф1	NULL
Шкаф2	Хорошо
Шкаф3	Недодел

И вот вопрос, как этот NULL здесь можно заменить на пустую строку? ЧТо лучше сделать: CASE, прверять на ISNULL...?
Не исключено, что и сам запрос здесь из древности прибыл, возможно его сделать иначе.
...
Рейтинг: 0 / 0
11.06.2018, 16:50
    #39659480
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
а, возможно ещё важные заметка, поля (SubjectID и CreatorID) - уникальный ключ
...
Рейтинг: 0 / 0
11.06.2018, 16:51
    #39659481
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
а, возможно ещё важная заметка, поля в таблице @Relations (SubjectID и CreatorID) - уникальный ключ
...
Рейтинг: 0 / 0
11.06.2018, 17:55
    #39659495
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
У меня ваш запрос возвращает пустую строку, а никакой не NULL, что логично,
ибо XML считает NULL пустой строкой.

А для таких данных вам результат нравится?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
--таблица изделий
declare @Subjects table([Name] varchar(10), id int)
insert into @Subjects(name, id)
select 'Шкаф1', 1 union all
select 'Шкаф2', 2 union all
select 'Шкаф3', 3  

--таблица мастеров
declare @Creators table(ID int, [Name] nvarchar(10))
insert into @Creators(ID, [Name])
select 1, 'Ivanov' union all
select 2, 'Petrov' union all
select 3, 'Sidorov'

--таблица связей
declare @Relations table(SubjectID int, CreatorID int, Comment nvarchar(20))
insert into @Relations(SubjectID, CreatorID, Comment)
select 1, 1, 'Хорошо' union all
select 1, 2, NULL union all
select 2, 2, 'Хорошо&Плохо' union all
select 3, 2, 'Недодел' union all
select 2, 3, NULL 

--нужно получить все изделия конкретного мастера (CreatorID=2) с комментариями. В этом поле Comment могут быт NULL 
SELECT s.[Name], 
	quotename((select rel.Comment as 'data()' 
		FROM @Subjects AS s2 INNER JOIN @Relations as rel ON s2.ID = rel.SubjectID AND rel.[CreatorID] = 2 
		WHERE s.id = s2.id order by rel.[CreatorID] for xml path('')))
	FROM @Subjects s
...
Рейтинг: 0 / 0
11.06.2018, 18:23
    #39659503
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
iapУ меня ваш запрос возвращает пустую строку, а никакой не NULL, что логично,
ибо XML считает NULL пустой строкой.
Я сам увидел это, да. Но, на реальных данные там действительно NULL возвращает. Возможно на виртуальных таблицах иначе реализовано.

iapА для таких данных вам результат нравится?
Тут всё равно надо "чистить" результат на клиенте, а, собственно, этого и хочу избежать, т.к. массив сразу падает на лист Excel. Но если есть NULL, то возникает исключение.

Пока обернул в такой вариант, чтоб работала не стояла:
Код: sql
1.
2.
3.
cast(ISNULL((select rel.Comment as 'data()' 
		FROM @Subjects AS s2 INNER JOIN @Relations as rel ON s2.ID = rel.SubjectID AND rel.[CreatorID] = 2 
		WHERE s.id = s2.id order by rel.[CreatorID] for xml path('')),'') as nvarchar(255)), m.CategoryID, 4 
...
Рейтинг: 0 / 0
11.06.2018, 18:28
    #39659504
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
Пардон,
в конце m.CategoryID, 4 случайно скопипастил.
...
Рейтинг: 0 / 0
11.06.2018, 18:33
    #39659507
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
palladin600iapА для таких данных вам результат нравится?
Тут всё равно надо "чистить" результат на клиенте, а, собственно, этого и хочу избежать, т.к. массив сразу падает на лист Excel. Но если есть NULL, то возникает исключение.

Пока обернул в такой вариант, чтоб работала не стояла:
Код: sql
1.
2.
3.
cast(ISNULL((select rel.Comment as 'data()' 
		FROM @Subjects AS s2 INNER JOIN @Relations as rel ON s2.ID = rel.SubjectID AND rel.[CreatorID] = 2 
		WHERE s.id = s2.id order by rel.[CreatorID] for xml path('')),'') as nvarchar(255)), m.CategoryID, 4 

Достаточно так:

Код: sql
1.
2.
3.
(select rel.Comment
		FROM @Subjects s2 JOIN @Relations rel ON s2.ID = rel.SubjectID AND rel.[CreatorID] = 2 
		WHERE s.id = s2.id order by rel.[CreatorID] for xml path(''), TYPE).value('.','nvarchar(255)')
...
Рейтинг: 0 / 0
21.06.2018, 14:01
    #39663642
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
iapДостаточно так:

кстати, не сработало. Попались данные с NULL'ом. Так вот Null и вернуло, вместо пустой строки.
...
Рейтинг: 0 / 0
21.06.2018, 14:05
    #39663645
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
palladin600iapДостаточно так:

кстати, не сработало. Попались данные с NULL'ом. Так вот Null и вернуло, вместо пустой строки.Весь результат обработать ISNULLом, да и дело с концом
...
Рейтинг: 0 / 0
21.06.2018, 14:08
    #39663646
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
palladin600iapДостаточно так:

кстати, не сработало. Попались данные с NULL'ом. Так вот Null и вернуло, вместо пустой строки.Попробуйте в текст вставить символы "&", "<", ">" и т.п. и сравните ваш вариант и мой.
...
Рейтинг: 0 / 0
21.06.2018, 16:15
    #39663697
palladin600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
iap, можно ли вообще здесь избавиться от подзапроса, который через xml вытаскивает? Просто данные из поля Comment получить. Это ж обычное поле, для чего тут xml?
...
Рейтинг: 0 / 0
21.06.2018, 16:24
    #39663706
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обрaботать NULL в подзапросе, подскажите пожалуйста
palladin600,

у вас, похоже, могут быть несколько строк в @relations по одному изделию
а подзапрос их склеивает.

если не может быть несколько строк, то можно заменить подзапрос на left join

возможно, изначально не было фильтра по rel.[CreatorID] = 2, это объяснило бы наличие order by
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обрaботать NULL в подзапросе, подскажите пожалуйста / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]