如何从数据库中检索非空和非重复数据?

Posted

技术标签:

【中文标题】如何从数据库中检索非空和非重复数据?【英文标题】:How do I retrieve non-empty & non-duplicate data from the database? 【发布时间】:2018-11-25 21:45:50 【问题描述】:

我的桌子上有这个挑剔的列(因为其余的与问题无关)。

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,但我认为它不起作用,因为我只使用了一张桌子。

我也试过了:

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

但总是有错误:

text、ntext 和 image 数据类型不能进行比较或排序,除非使用 IS NULL 或 LIKE 运算符。

【问题讨论】:

如果添加脚本(表格和示例数据)和预期输出会更好 要在 linq 中获取非重复项,您可以使用 GroupBy,然后从每个组中获取第一项。 Null 您需要更改该值不等于 Db.Null。 ntexttextimage 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)。 See details here 【参考方案1】:

以下查询可能有用。

    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)

【讨论】:

我忘记将我的 ID 和通用名称格式化为文本。在 sql server 上尝试以下查询作为测试运行,出现此错误:“数据类型 text 和 varchar 在等于运算符中不兼容。” 它在 sql server 中工作,但是当我把它放在我的 c# 代码中时,它一直有这个错误:“列 'Item_GenName' 不属于表”。【参考方案2】:

以下查询应该只返回不同的、非空的 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 语句的整个域中返回唯一记录。如果您在选择语句中包含 ID 列,即使是不同的选择也会返回您的重复 Item_GenNames b/c 组合的 ID / Item_GenName 记录将是唯一的。在您的选择子句中仅包含 Item_GenName 以保证该列的不同值。

【讨论】:

'text' 数据类型已被弃用,因此我没有太多经验,但您可以使用this method 检查空/空。我将编辑我的答案以反映。 当我在 sql server 上尝试这个时,它成功了!但是当我将它应用到我的 c# 代码时,它一直有这个错误说“列 'Item_GenName' 不属于表。”。 我所做的修复它是将“作为 Item_GenName”。【参考方案3】:

你可以试试这个查询

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

内部查询删除非空记录,外部查询从内部输出中获取不同的记录

【讨论】:

以上是关于如何从数据库中检索非空和非重复数据?的主要内容,如果未能解决你的问题,请参考以下文章

java空和非空判断

如何从重复记录中检索mysql表中的最新数据

如何从 Promise 中检索数据 [重复]

如何从数据库中检索所有表? (Android,SQLite)[重复]

我如何从firebase检索数据到android listview顶部[重复]

如何在保持格式的同时从数据库中检索和回显文本[重复]