2010-01-11 3 views
1

나는 다음과 같은 SQL 쿼리가 : 이제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.) 

을 내가 정규식을 사용한다면, 나는 수도 무리 모든 NOT으로 하나의 큰에 (점점 | 계약 | 방지),하지만 난 할 방법을 잘 모르겠어요 이 SQL.

이 쿼리를 좀 더 읽기 쉽고 우아하게 렌더링 할 수있는 방법이 있습니까?

+1

어떤 데이터베이스를 사용하고 있습니까? –

+0

RDBMS의 어떤 맛? 그 중 일부는 RegEx를 지원하기 때문에 (예 : Oracle 10g 이상). RegEx를 사용하더라도 꽤 복잡합니다. – APC

+2

정규 표현식을 통합하면 더 효율적으로 만들 수 있습니다. 그 외에도 모든 DBMS에서 지원되는 것은 아니므로 어느 것을 사용합니까? – Tomalak

답변

4

그냥 여분의 물건을 제거하고 SQL이 방법 쿨러 보이는 일관된 명명 규칙을 사용하여 : 당신은 정규 표현식에 대해 이야기

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

합니다. 어떤 DBMS는 MySQL, Oracle을 가지고 있습니다. 그러나 어느 구문을 선택하든 쿼리의 실행 계획을 고려해야합니다 : "얼마나 좋은가"보다는 "얼마나 빠릅니까". 그건 당신이 사용하고있는 거라면

SELECT something FROM table WHERE column REGEXP 'regexp' 

그래서, 당신은 가능성이 좀 더 컴팩트하여 4 개 like 기준 즉 정규 표현식 문자열을 쓸 수 있습니다 : MySQL과

+0

성능이별로 좋지 않습니다. 고정 된 데이터 세트에서 필기 검색 쿼리를 실행하여 관련없는 데이터를 제거하려고합니다. 정보를 찾을 때까지 더 많은 세부 조정을 추가하는 간단한 방법을 찾고 있습니다. 나는 필요하다. 이와 같이 위의 예에서 나는 결과에서 벗어나기를 원하는 다른 gerund를 계속 추가하고 전체 라인을 추가하는 것보다 효율적인 방법이 있다고 생각합니다. – Jono

+0

글쎄, 그것은 정규식과 꽤 비슷하지만 Access에서는 작동합니다. 감사. – Jono

0

사용중인 SQL 서버에 따라 REGEX 자체를 지원할 수 있습니다. 예를 들어 Google 검색은 SQL Server, Oracle 및 mysql이 모두 정규식을 지원함을 보여줍니다.

1

, 당신은 regular expression where-clause parameters 사용할 수있어 . 그러나 쿼리가 다른 사람들을 위해 무엇을하는지 쉽게 볼 수는 없습니다.

마치 SQL 서버 offers a similar feature처럼 보입니다. 당신이 당신의 데이터를 마이닝로 이동 당신이 구축하고처럼 소리 SINEC

1

, 여기 당신이 고려할 수 뭔가 :

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) 

그러면 언제나 동일한 쿼리를 실행하고 당신은 단순히 무엇을 변경할 수 있습니다 포함 및 제외 테이블에서 검색을 구체화하십시오.

+0

흥미로운 접근 방법입니다. 거기에 SQL에서 배열 변수를 가진 간단한 해결책이 없다고 생각합니다. – Jono

+0

흠. 나는 이것을 정말로 좋아하기 시작했습니다. – Jono

+0

좋아, 이것을 구현하려고 할 때 문제가 있음을 발견했습니다. 나는 거기에서 어떤 OR도 할 수 없습니다. 그래서 나는 물건을 결합 할 수 없다. 예를 들어 '예술'과 '학교'또는 '학위'를 찾고 '부분'은 찾지 않습니다. – Jono

0

모든 부정적인 기준을 CASE 표현의 단락 회로에 넣을 수 있습니다 (MSAccess에 대해 확실하지 않은 Sql Server에서 작동).

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

Jet/ACE/Access는 CASE를 지원하지 않으므로이 대답은 쓸모가 없으므로 삭제해야합니다. –

관련 문제