SQL选择跨多行的列不喜欢的位置
我有一张这样的桌子:SQL选择跨多行的列不喜欢的位置,sql,sql-server,select,Sql,Sql Server,Select,我有一张这样的桌子: +------+-------+-------------+ ID_Loc Type Data +------+-------+-------------+ ABC RMKS Hello ABC NAM Joe Smith ABD NAM Peter Hill ABD RMKS Bye Bye ABD NAM Freddy Tall ABE NAM Loran Bennett
+------+-------+-------------+
ID_Loc Type Data
+------+-------+-------------+
ABC RMKS Hello
ABC NAM Joe Smith
ABD NAM Peter Hill
ABD RMKS Bye Bye
ABD NAM Freddy Tall
ABE NAM Loran Bennett
ABE RMKS Bye Bye
ABF NAM Liv Claris
ABF RMKS Bye Bye
+------+-------+-------------+
我需要选择所有ID_Loc,其中数据不象“Hello”。当我尝试时:
SELECT distinct ID_loc FROM data_full WHERE DATA NOT LIKE '% Hello'
这也会选择ID_Loc:'ABC',它在数据中包含'Hello'。
另外,由于这将影响相当多的or行,如果我可以将查询指向只查看使用了RMKS类型的行,那就太好了
我正在使用MS SQL Server 2008
SQL FIDLE地址为:
任何帮助都将不胜感激 您需要删除空间,还添加了RMKS过滤器
SELECT distinct ID_loc
FROM data_full
WHERE Type= 'RMKS'
and DATA NOT LIKE '%Hello' --'%Hello%' if it can be between other text
编辑:
如果ID\u Loc,则类型不唯一:
SELECT distinct ID_loc
FROM data_full
WHERE ID_loc NOT IN (SELECT ID_loc FROM data_full WHERE Type= 'RMKS'
and DATA LIKE '%Hello')
如果您需要选择没有与'%Hello'
模式匹配的记录的ID\u Loc
值,请执行以下查询:
SELECT ID_loc
FROM data_full
group by ID_Loc
having max(case
when DATA LIKE '%Hello' then 1
else 0
end) = 0;
结果是:
如果还需要应用Type='RMKS'
过滤器,可以在WHERE
子句()中执行此操作:
您需要删除空格并按类型筛选
SELECT distinct ID_loc
FROM data_full
WHERE DATA NOT LIKE '%Hello%' And [TYPE] = 'RMKS'
首先,从LIKE
子句中删除空格,然后,可以使用EXISTS
子句筛选符合条件的结果:
查询:
SELECT DISTINCT t.ID_loc
FROM data_full t
WHERE NOT EXISTS (SELECT ID_loc
FROM data_full
WHERE Data LIKE '%Hello' AND ID_loc = t.ID_loc )
AND
EXISTS (SELECT ID_loc
FROM data_full
WHERE Type = 'RMKS' AND ID_loc = t.ID_loc )
| ID_loc |
|--------|
| ABD |
| ABE |
| ABF |
:
SELECT DISTINCT t.ID_loc
FROM data_full t
WHERE NOT EXISTS (SELECT ID_loc
FROM data_full
WHERE Data LIKE '%Hello' AND ID_loc = t.ID_loc )
AND
EXISTS (SELECT ID_loc
FROM data_full
WHERE Type = 'RMKS' AND ID_loc = t.ID_loc )
| ID_loc |
|--------|
| ABD |
| ABE |
| ABF |
一个带有反向逻辑的简单解决方案,在不存在的地方,您需要一个
SELECT distinct t.ID_loc FROM data_full t
where not exists (
select 1 from data_full t2
where t2.ID_loc=t.ID_loc and t2.type='RMKS' and t2.data like '%Hello')
ORDER BY 1;
不喜欢“%Hello”去掉空格。包含行ABC是因为喜欢“%Hello”加空格,而ABC的数据列只是“Hello”,根据where语句,结果是正确的HI,有时每行都有多个注释:只有当有一行类型为'RMKS'和数据为'Hello'时,这才有效。但是,如果RMK有多行,则不会出现这种情况work@Petrik这改变了问题,为了清晰起见,应该包含在原始数据或措辞中。。。