Member 14127871 Ответов: 3

Запрос Sql server возвращает “нет данных” в строке, если данные не найдены


Мой код способен извлекать данные кода книги, которые совпадают со штрих-кодом, но не тогда, когда нет совпадения данных. Я хочу, чтобы он напечатал "Bookcode not found" в ячейке также, если данные не найдены.

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

Я попробовал использовать один за другим штрих-код в sql server. Если я помещу только один пример штрих-кода "123", который не имеет данных, то ему удастся отобразить "Bookcode not found", но если я помещу 3 других штрих-кода, которые имеют данные, то "Bookcode not found" не будет включен. Я очень ценю вашу помощь.

WITH cte AS
(SELECT *,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid 
FROM [Danny].[dbo].[InventoryCustomer] WHERE Barcode In ('ean','9789830093819'))
SELECT InvtID, BOOKCODE = coalesce(InvtID, 'Bookcode not found') 
FROM cte WHERE rid=1 UNION SELECT InvtID = '', BOOKCODE = 'Bookcode not found' 
WHERE NOT EXISTS(SELECT 1 FROM CTE) 

Santosh kumar Pithani

Есть ли примеры данных и ожидаемый результат?

Member 14127871

Например мой скрипт выше будет отображаться как показано ниже если только я поставлю 1 штрих код который не имеет буккода
InvtID | Bookcode
null | Bookcode не найден

.. Ниже, если 1 код без книжного кода и 2 кода имеют книжный код
InvtID | Bookcode
CB0212 | CB0212
DD2921 | DD2921

Он пропускает "Буккод не найден", где ожидаемый результат я хочу, как показано ниже

InvtID | Bookcode
null | Bookcode не найден
CB0212 | CB0212
DD2921 | DD2921

Santosh kumar Pithani

Используете ли вы SQL Server 2016?

Member 14127871

Sql server 2008

Member 14127871

Это все запросы, которые я пробовал, но ни один из них не будет отображать "нет данных", если в sql нет строк. Он в основном просто отображает только существующие данные

1. 'SELECT isnull((выберите InvtID
Из InventoryCustomer где штрих-код в('123','9789830093819')),'нет bookcode найден)
Как Инвтид '

2. 'Select case when s.InvtID IS NOT NULL Then s.InvtID else 'no data' end as Bookcode
from (Select InvtID as InvtID FROM InventoryCustomer WHERE Barcode IN('123','9789830093819')) Р
Левое соединение InventoryCustomer s на s.InvtID = R. InvtID'

3. 'IF NOT EXISTS (Select InvtID From InventoryCustomer WHERE Barcode in ('123','9789830093819'))
Begin выберите "Bookcode not found" в качестве конца Bookcode
ЕЩЕ
Выберите InvtID из InventoryCustomer где штрих код в ('123','9789830093819')'

4. 'Выберите InvtID, случай, когда InvtID имеет значение null или InvtID=" затем "нет данных"
Еще Инвтид
Конец как Bookcode
От InventoryCustomer где штрих код в ('123','9789830093819')'

5. 'WITH cte AS(SELECT case WHEN InvtID IS NULL OR InvtID=" THEN 'No Bookcode Found'
Еще InvtID конец как InvtID,штрих-код,функции row_number() над(раздел по штрих-коду заказа на InvtID АСК)
избавиться от InventoryCustomer)
Выберите InvtID в качестве кода книги из cte, где rid=1 и штрих-код в ('123','9789830093819')'

3 Ответов

Рейтинг:
2

Santosh kumar Pithani

--Actually Table records is filtered by values but you including filtered values as records.This solution is given based on output,i hope this helpful 

CREATE TABLE #InventoryCustomer(InvtID Varchar(20),Bookcode Varchar(20),BarCode Varchar(50)) 

INSERT INTO #InventoryCustomer
Values
      ('CB0212','CB0212','ean'),
      ('DD2921','DD2921','9789830093819');

--In 2008 server need to create split_function for splitting  values.

select 
  ISNULL(InvtID,'') AS InvtID
 ,ISNULL(Bookcode,'Bookcode not found') AS Bookcode 

   FROM split_fun('1,ean,9789830093819',',') AS Stv LEFT JOIN #InventoryCustomer cte   
       ON( Stv.value=Cte.Barcode)

OUTPUT:
-------------------
InvtID | Bookcode
--------------------
	Bookcode not found
CB0212	CB0212
DD2921	DD2921


CHill60

Лучше бы было

select 
 ISNULL(InvtID,Stv.[value]) AS InvtID,
 ISNULL(Bookcode,'Bookcode not found') AS Bookcode 
FROM string_split('1,ean,9789830093819',',') AS Stv 
LEFT JOIN #InventoryCustomer cte   ON Stv.value=Cte.Barcode
что дало бы результат
InvtID  Bookcode
-----------------
1	Bookcode not found
CB0212	CB0212
DD2921	DD2921

Santosh kumar Pithani

Какой смысл публиковать одно и то же решение в комментариях?

CHill60

Это не одно и то же решение. Я изменил твою жизнь.

ISNULL(InvtID,0)
к
ISNULL(InvtID,Stv.[value])
о чем свидетельствует изменение объема производства.
В противном случае вы не сможете легко определить, какие книжные коды не были найдены

Member 14127871

Есть ли другая альтернатива, кроме использования string_split, так как я боюсь, что другая база данных будет затронута, если я изменю совместимость моего sql-сервера на другой уровень, чтобы использовать эту функцию. На самом деле это нормально получить столбец Bookcode только без столбца InvtID

Santosh kumar Pithani

Если вы боитесь использовать string split, то возьмите параметр table type, для которого это идеальное решение.

Создать тип Temp в виде таблицы(Barcode Varchar(100));
Вставьте параметры(1,ean,9789830093819) в тип таблицы со стороны приложения .
Передайте этот тип таблицы в качестве параметра хранимой процедуры.

Объявить @Temp Temp ;

выбирать
ISNULL(InvtID,") как InvtID
,ISNULL(Bookcode,'Bookcode не найден') Как Bookcode

FROM @Temp AS Stv LEFT JOIN #InventoryCustomer cte
На( СТВ.значение=КТР.Штрих-код)



CHill60

Вместо использования встроенной функции в более поздних версиях SQL у большинства из нас есть пользовательская функция, которая делает то же самое. Я "позаимствовал" тот, который использую у SQLServerCentral.com но есть и другие перечисленные здесь … Разделите строки правильным способом - или следующим лучшим способом[^]

Рейтинг:
1

OriginalGriff

Решение Мацея будет работать, но ... на самом деле это не функция извлечения данных, а функция презентации, и было бы гораздо лучше и эффективнее сделать это на вашем языке презентации.

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

Решение Мацея будет работать, но это означает эффективное выполнение запроса дважды, что является неэффективным и чревато проблемами, если запрос необходимо изменить.


Maciej Los

Я ждал этого... :) Спасибо. Это самый ценный комментарий, опубликованный в решении.

Что вы думаете о нижеследующей форме?

 SELECT ISNULL(BookCode, 'Not found'), Field2, Field3, ...
FROM TableName
WHERE BookCode = '12345'

OriginalGriff

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

MadMyche

Ключевым термином в этом ответе является это функция презентации ОП должен выполнить запрос, и если строки не возвращаются, то вы выводите сообщение "не найдено".

Maciej Los

Полностью согласен.

Member 14127871

Не могли бы вы подробнее рассказать о функции презентации?

OriginalGriff

Вы можете посмотреть здесь:
https://en.wikipedia.org/wiki/Multitier_architecture
SQL является частью уровня данных и выполняет такие функции данных, как извлечение и хранение.
То, что вы пытаетесь сделать, связано с тем, как эти данные отображаются пользователю - это часть уровня представления.

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

Рейтинг:
0

Maciej Los

Короче говоря: вы можете использовать ЕСЛИ[^] + СУЩЕСТВУЕТ[^]:

IF NOT EXISTS
(
    SELECT TOP 1 Barcode FROM [Danny].[dbo].[InventoryCustomer] WHERE Barcode In ('ean','9789830093819'))
) 
   SELECT 'Bookcode not found'
ELSE
    SELECT Your_Complex_Query_Here
END


Member 14127871

Я попробовал это сделать, но все еще не могу отобразить "нет данных", если в sql нет строк. Я перечисляю все запросы, которые я пробовал в комментарии выше

Maciej Los

Проверьте обновленный ответ.

Member 14127871

Не работает и это. Я уже пыталась срастаться, и isnull, если существует случай, когда соединение, левое соединение же результаты

Maciej Los

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