Сделать запрос SQL более эффективным и аккуратным? - PullRequest
1 голос
/ 11 января 2010

У меня следующий запрос 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, я мог бы объединить все Ноты в один большой (получить | сокращение | предотвращение), но я не уверен, как это сделать в SQL.

Есть ли способ сделать этот запрос более разборчивым / элегантным?

Ответы [ 5 ]

4 голосов
/ 11 января 2010

Просто удалив лишние вещи и используя согласованное соглашение об именах, ваш 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 ... Однако при выборе любого синтаксиса следует учитывать план выполнения запроса: «насколько он быстрый», а не «как красиво он выглядит».

1 голос
/ 11 января 2010

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)

Тогда вы всегда просто выполняете один и тот же запрос, и вы можете просто изменить содержимое таблиц «Включения» и «Исключения», чтобы уточнить результаты поиска.

1 голос
/ 11 января 2010

С MySQL вы можете использовать регулярные выражения, где-предложения параметры :

SELECT something FROM table WHERE column REGEXP 'regexp'

Так что, если вы используете именно это, вы можете написать строку регулярного выражения, которая, возможно, немного более компактна, чем ваши критерии 4 like. Однако может быть не так легко увидеть, что запрос делает для других людей.

Похоже, что SQL Server предлагает аналогичную функцию .

0 голосов
/ 10 февраля 2011

Вы можете вставить все свои отрицательные критерии в короткое замыкание CASE (работает на Sql Server, не уверен насчет MSAccess).

SELECT *
FROM phrases
WHERE phrase LIKE '%ing aids%'
  AND CASE
    WHEN phrase LIKE '%getting%' THEN 2
    WHEN phrase LIKE '%contracting%' THEN 2
    WHEN phrase LIKE '%preventing%' THEN 2
    ELSE 1
  END = 1

Что касается "более эффективной" стороны, вам нужно найти некоторые критерии, которые позволят вам избежать чтения всего столбца фраз. Двусторонний критерий подстановки плох. Правильный критерий с подстановочными знаками хорош.

0 голосов
/ 11 января 2010

В зависимости от того, какой SQL-сервер вы используете, он может поддерживать сам REGEX. Например, поиски в Google показывают, что SQL Server, Oracle и mysql поддерживают регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...