如何从数据库中检索非空和非重复数据?
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。ntext
、text
和 image
数据类型将在 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
内部查询删除非空记录,外部查询从内部输出中获取不同的记录
【讨论】:
以上是关于如何从数据库中检索非空和非重复数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何从数据库中检索所有表? (Android,SQLite)[重复]