Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择跨多行的列不喜欢的位置_Sql_Sql Server_Select - Fatal编程技术网

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这改变了问题,为了清晰起见,应该包含在原始数据或措辞中。。。