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

Всковырнул старинный механизм, где надо обработать 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
Как обрaботать NULL в подзапросе, подскажите пожалуйста
    #39659480
palladin600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, возможно ещё важные заметка, поля (SubjectID и CreatorID) - уникальный ключ
...
Рейтинг: 0 / 0
Как обрaботать NULL в подзапросе, подскажите пожалуйста
    #39659481
palladin600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, возможно ещё важная заметка, поля в таблице @Relations (SubjectID и CreatorID) - уникальный ключ
...
Рейтинг: 0 / 0
Как обрaботать NULL в подзапросе, подскажите пожалуйста
    #39659495
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня ваш запрос возвращает пустую строку, а никакой не 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
Как обрaботать NULL в подзапросе, подскажите пожалуйста
    #39659503
palladin600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как обрaботать NULL в подзапросе, подскажите пожалуйста
    #39659504
palladin600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон,
в конце m.CategoryID, 4 случайно скопипастил.
...
Рейтинг: 0 / 0
Как обрaботать NULL в подзапросе, подскажите пожалуйста
    #39659507
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как обрaботать NULL в подзапросе, подскажите пожалуйста
    #39663642
palladin600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapДостаточно так:

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

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

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

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

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

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


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