使SQL请求更高效、更整洁?

使SQL请求更高效、更整洁?,sql,database,ms-access,Sql,Database,Ms Access,我有以下SQL查询: SELECT Phrases.* FROM Phrases WHERE (((Phrases.phrase) Like "*ing aids*") AND ((Phrases.phrase) Not Like "*getting*") AND ((Phrases.phrase) Not Like "*contracting*")) AND ((Phrases.phrase) Not Like "*preventing*"); //(etc.) 现在,如果

我有以下SQL查询:

SELECT Phrases.*
FROM Phrases
WHERE (((Phrases.phrase) Like "*ing aids*") 
  AND ((Phrases.phrase) Not Like "*getting*") 
  AND ((Phrases.phrase) Not Like "*contracting*")) 
  AND ((Phrases.phrase) Not Like "*preventing*"); //(etc.)
现在,如果我使用RegEx,我可能会把所有的not都集中到一个大的(geting | contracting | prevention)中,但我不知道如何在SQL中实现这一点


有没有办法更清晰/优雅地呈现此查询?

根据您使用的SQL server,它可能支持REGEX本身。例如,google搜索显示SQL Server、Oracle和mysql都支持正则表达式。

根据您使用的SQL Server,它可能支持正则表达式本身。例如,谷歌搜索显示SQL Server、Oracle和mysql都支持正则表达式。

只需删除冗余内容并使用一致的命名约定,您的SQL看起来就更酷了:

SELECT *
FROM phrases
WHERE phrase     LIKE '%ing aids%'
  AND phrase NOT LIKE '%getting%'
  AND phrase NOT LIKE '%contracting%' 
  AND phrase NOT LIKE '%preventing%'

你说的是正则表达式。有些数据库管理系统有:MySQL、Oracle。。。但是,选择任何一种语法都应该考虑查询的执行计划:“它有多快”,而不是“它看起来有多漂亮”。

只需删除多余的内容并使用一致的命名约定,您的SQL看起来就更酷了:

SELECT *
FROM phrases
WHERE phrase     LIKE '%ing aids%'
  AND phrase NOT LIKE '%getting%'
  AND phrase NOT LIKE '%contracting%' 
  AND phrase NOT LIKE '%preventing%'

你说的是正则表达式。有些数据库管理系统有:MySQL、Oracle。。。但是,两种语法的选择都应该考虑查询的执行计划:“它有多快”,而不是“它看起来有多漂亮”。

对于MySQL,您可以使用:

因此,如果您使用的是正则表达式字符串,那么您可以编写一个正则表达式字符串,它可能比您的4
like
标准更紧凑。然而,要了解查询对其他人的作用可能并不那么容易


它看起来像SQL Server。

通过MySQL,您可以使用:

因此,如果您使用的是正则表达式字符串,那么您可以编写一个正则表达式字符串,它可能比您的4
like
标准更紧凑。然而,要了解查询对其他人的作用可能并不那么容易


它看起来像SQL Server。

Sinec听起来像是在挖掘数据时构建的,您可以考虑以下几点:

CREATE TABLE Includes (phrase VARCHAR(50) NOT NULL)
CREATE TABLE Excludes (phrase VARCHAR(50) NOT NULL)

INSERT INTO Includes VALUES ('%ing aids%')
INSERT INTO Excludes VALUES ('%getting%')
INSERT INTO Excludes VALUES ('%contracting%')
INSERT INTO Excludes VALUES ('%preventing%')

SELECT
     *
FROM
     Phrases P
WHERE
     EXISTS (SELECT * FROM Includes I WHERE P.phrase LIKE I.phrase) AND
     NOT EXISTS (SELECT * FROM Excludes E WHERE P.phrase LIKE E.phrase)

然后,您总是在运行同一个查询,只需更改include和Excludes表中的内容即可优化搜索。

Sinec听起来您在挖掘数据时正在构建此查询,您可以考虑以下事项:

CREATE TABLE Includes (phrase VARCHAR(50) NOT NULL)
CREATE TABLE Excludes (phrase VARCHAR(50) NOT NULL)

INSERT INTO Includes VALUES ('%ing aids%')
INSERT INTO Excludes VALUES ('%getting%')
INSERT INTO Excludes VALUES ('%contracting%')
INSERT INTO Excludes VALUES ('%preventing%')

SELECT
     *
FROM
     Phrases P
WHERE
     EXISTS (SELECT * FROM Includes I WHERE P.phrase LIKE I.phrase) AND
     NOT EXISTS (SELECT * FROM Excludes E WHERE P.phrase LIKE E.phrase)

然后,您总是在运行同一个查询,只需更改Includes和Excludes表中的内容即可优化搜索。

您可以将所有否定条件推送到短路案例表达式中(works Sql Server,不确定MSAccess)


在“更高效”方面,您需要找到一些标准,以避免阅读整个短语列。双边通配符条件不好。右侧通配符条件很好。

您可以将所有否定条件推送到短路大小写表达式中(works Sql Server,不确定MSAccess)


在“更高效”方面,您需要找到一些标准,以避免阅读整个短语列。双边通配符条件不好。右侧通配符标准很好。

RDBMS的哪种风格?因为其中一些支持正则表达式(例如Oracle 10g+)。尽管即使使用正则表达式,这也会非常复杂。我怀疑通过合并正则表达式,是否可以提高效率。除此之外,并不是每个DBMS都支持它们,那么您使用哪一个呢?它是一个本地.mdb文件,我正在MS Access 2007中编写查询。正如我在下面的评论中所解释的,我只是在寻找一些信息(数据的一个未知子集,在本例中是“助听器”、“阅读辅助器”,等等),我试图完善一个针对特定时刻手写的查询。当然,接下来的每个查询都会略有不同,但我可能也需要一种方法来实现这一点。aaaa我发现Access不支持正则表达式。啊。然而,我确实学会了如何在SQL中实现这一点。耶!如果您对在Access中使用RegEx感兴趣,可以通过文件系统对象使用它。但它不会使用索引,因为它不在Jet/ACE数据库引擎中,而是在VBA中。RDBMS的风格是什么?因为其中一些支持正则表达式(例如Oracle 10g+)。尽管即使使用正则表达式,这也会非常复杂。我怀疑通过合并正则表达式,是否可以提高效率。除此之外,并不是每个DBMS都支持它们,那么您使用哪一个呢?它是一个本地.mdb文件,我正在MS Access 2007中编写查询。正如我在下面的评论中所解释的,我只是在寻找一些信息(数据的一个未知子集,在本例中是“助听器”、“阅读辅助器”,等等),我试图完善一个针对特定时刻手写的查询。当然,接下来的每个查询都会略有不同,但我可能也需要一种方法来实现这一点。aaaa我发现Access不支持正则表达式。啊。然而,我确实学会了如何在SQL中实现这一点。耶!如果您对在Access中使用RegEx感兴趣,可以通过文件系统对象使用它。但它不会使用索引,因为它不在Jet/ACE数据库引擎中,而是在VBA中。我不是在追求性能——我在固定数据集上运行手写查询,试图删除不相关的数据——我在寻找一种简单的方法来添加越来越多的细化,直到找到所需的信息。因此,在上面的例子中,我一直在添加另一个动名词,我想不让它出现在结果中,我想也许有一种比添加一整行更有效的方法。谢谢。我不是在追求性能——我在一个固定的数据集上运行手写查询,试图删除不相关的数据——而是在寻找一种简单的方法来添加越来越多的改进,直到找到我需要的信息。因此,在上面的例子中,我不断地添加另一个动名词,我想不让它出现在结果中,并且认为可能有一个mo