0

示例表(Person_data)

Name   |   Area      |   Id
=============================== 
Jack   | A_102       |  102   
Roy    | Abc-34      |  109   
tom    | ABC6778     |  107    
Aly    | hj23        |  122   
Saly   | dsfds       |  342

我需要一个查询,以便它返回 Area 列不包含_or-Abcor的所有行ABC

我的查询

Select * from Person_data 
where area not like '%-%' 
or area not like '%_%' 
or area not like '%Abc%' 
or area not like '%ABC%';
4

5 回答 5

2

返回区域列不包含“_”或“-”或“Abc”或“ABC”的所有行

您需要将这些搜索条件与AND's 结合起来,但问题是_which 是LIKE谓词中的保留通配符。您必须在LIKE谓词 using中对其进行转义,或者您可以使用类似 的关键字[]确定要使用的任何转义字符来转义它 ,因此它将被视为文字,并且它是这样的标准方式:ESCAPELIKE '%\_%' ESCAPE '\'

SELECT * 
FROM PersonData
WHERE area NOT LIKE '%-%'
AND area NOT LIKE '%\_%' ESCAPE '\'
AND area NOT LIKE '%Abc%' 
AND area NOT LIKE '%ABC%';

这是一个 SQL Fiddle 演示

于 2012-10-02T02:27:37.253 回答
2
SELECT * 
FROM PersonData
WHERE area NOT LIKE '%-%'
    AND area NOT LIKE '%[_]%' -- brackets for special character matching
    AND area NOT LIKE '%Abc%' 
    AND area NOT LIKE '%ABC%';

正如其他人所提到的,您可能需要AND运算符而不是OR运算符,因为您当前的查询看起来可能会返回任何非空值。

此外,您必须对文字下划线的匹配进行转义或括起来,因为它是SQL Server_中的特殊通配符NOT LIKE '%_%'(在语义上与 相同LIKE '')。

另一个有趣的事情是同时使用Abcand ABC,这仅在您需要区分大小写时才需要。

于 2012-10-02T02:36:14.617 回答
0

您并没有真正提出问题,但我认为您希望您的“ORs”是“ANDs”。

于 2012-10-02T02:22:48.017 回答
0

将 OR 替换为 AND。现在它得到所有不包含至少一个符号的行。

于 2012-10-02T02:24:15.030 回答
0

您需要AND为 WHERE 子句使用条件而不是 OR 条件:

SELECT * 
FROM `Person_data` 
WHERE `area` NOT LIKE '%-%' 
AND `area` NOT LIKE '%_%' 
AND `area` NOT LIKE '%Abc%' 
AND `area` NOT LIKE '%ABC%';
于 2012-10-02T02:27:45.083 回答