Как получить непустые и не дублируемые данные из базы данных?

У меня есть эти nitpicked столбцы на моем столе (потому что остальные не имеют отношения к проблеме).

ID   | Generic Name
-----+---------------
001  | Cetirizine
002  | Cetirizine
003  |
004  | Paracetamol

Я хочу, чтобы в моем поле со списком отображалась только одна запись Cetirizine (или любые данные, которые были дублированы) и никаких пустых общих имен (некоторые данные не имеют общих имен).

Я пробовал:

select 
    Item_GenName 
from 
    ItemMasterlistTable 
where 
    nullif(convert(varchar, Item_GenName), '') is not null

но он достигает только пустой части данных.

Я пробовал использовать DISTINCT, но он не работает, и кто-то предложил JOIN но я не думаю, что он работает, так как я использую только 1 таблицу.

Я также пробовал:

SELECT 
    MIN(Item_ID) AS Item_ID, Item_GenName
FROM
    ItemMasterlistTable
GROUP BY 
    Item_GenName

но всегда есть ошибка:

Типы данных text, ntext и image нельзя сравнивать или сортировать, за исключением случаев использования оператора IS NULL или LIKE.

+1
источник поделиться
3 ответа

Следующий запрос должен возвращать только отдельные, непустые Item_GenNames:

SELECT DISTINCT Item_GenName
FROM ItemMasterlistTable
// because Item_GenName is of type *text*, the below in lieu of 'is not null' and '!= '''
WHERE datalength(Item_GenName) != 0

Вы сказали, что попробовали DISTINCT и это не сработало, поэтому я хочу уточнить,

Ключевое слово DISTINCT вернет уникальные записи по всему домену вашего оператора select. Если вы включите столбец идентификатора в свой оператор select, даже отдельный выбор вернет ваши повторяющиеся Item_GenNames b/c, объединенная запись ID/Item_GenName будет уникальной. Включите только Item_GenName в предложение select, чтобы гарантировать отличные значения для этого столбца.

+2
источник

Может оказаться полезным следующий запрос.

    declare @tab table (ID varchar(10), Generic_Name varchar(100))
    insert into @tab
    select '001',   'Cetirizine'
    union 
    select '002',   'Cetirizine'
    union 
    select '003',   ''
    union 
    select '004',   'Paracetamol'

    select MIN(substring(ID, 1, 10)) ID, substring(Generic_Name, 1, 1000) Generic_Name
from @tab
where substring(Generic_Name, 1, 1) <> ''
group by substring(Generic_Name, 1, 1000)
+1
источник

Вы можете попробовать этот запрос

Select  distinct Item_GenName FROM(
Select * FROM ItemMasterlistTable where Item_GenName <> ''
)t

Внутренний запрос удаляет непустые записи и внешний запрос, получая отдельную запись из внутреннего вывода

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос