Как использовать мой псевдоним в предложении where? - PullRequest
2 голосов
/ 04 февраля 2011

Я пытаюсь найти в нескольких столбцах текста и заметок определенные фразы и фразы из черного списка, которые я не хочу видеть.

Предположим, следующая таблица

stories: 
id, title, author, publisher, content

Ex. Я хочу найти все истории, которые упоминают (в любой области) «яблоки», но помещают в черный список «яблочное пюре».

SELECT stories.id, [stories.title] & " " & [stories.author] & " " & [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories
WHERE ((([allMyText]) Like "*apples*" And ([allMyText]) Not Like "*applesauce*"));

Как мне использовать мой псевдоним в предложении where? Я не могу найти документацию по этому вопросу:

1) Возможен ли такой подход?
2) Разве альтернатива не будет означать, что я буду выполнять многократное объединение строк на каждой итерации строки?

Ответы [ 3 ]

4 голосов
/ 04 февраля 2011

Я не могу использовать свой псевдоним в предложении where.

1. Возможен ли такой подход?

Конечно, поместите его в подзапрос.

SELECT *
FROM
(
SELECT stories.id, [stories.title] & " " & [stories.author] & " " & [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories
) AS SUBQ
WHERE ((([allMyText]) Like "*apples*" And ([allMyText]) Not Like "*applesauce*"));

2. Разве альтернатива не будет означать, что я буду выполнять множественные объединения строк на каждой итерации строки?

Да, верно, альтернатива - repeat выражение.Я не буду утомлять вас кодом для этой альтернативы.

Для вашего конкретного запроса вы также можете использовать этот

SELECT stories.id, [stories.title] & " " & [stories.author] & " " & [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories
WHERE ([stories.title] Like "*apples*" OR [stories.author] Like "*apples*" 
  OR [stories.publisher] Like "*apples*" OR [stories.memo] Like "*apples*")
AND NOT ([stories.title] Like "*applesauce*" OR [stories.author] Like "*applesauce*"
  OR [stories.publisher] Like "*applesauce*" OR [stories.memo] Like "*applesauce*")
3 голосов
/ 04 февраля 2011

Единственная проблема в том, что что я пытаюсь сделать, я не могу использовать свой псевдоним в пункте, где. Я не могу найти ни одного документация по теме

Да, документации по языку Access / Jet / ACE 'SQL' очень не хватает, а в немногих доступных есть шокирующие ошибки.

Вот некоторая документация по SQL в целом:

«Мышление Джо Селко в наборах: вспомогательные, временные и виртуальные таблицы в SQL», ch12, pp235-237:

Вот как SELECT работает в SQL ... Начните с предложения FROM ... Перейти к WHERE пункт ... Перейти к необязательный GROUP BY пункт ... Перейти к необязательное предложение HAVING ... Перейти к SELECT и построить выражения в списке. Это означает что скалярные подзапросы, функция звонки и выражения в SELECT делается после всех других пунктов сделано. Оператор AS также может дать имена выражениям в SELECT list. Эти новые имена приходят в существование все сразу, но после предложение WHERE, предложение GROUP BY и HAVING пункт был казнены; Вы не можете использовать их в SELECT список или WHERE предложение по этой причине.

Я думаю, это объясняет, почему нельзя использовать as clause («псевдоним столбца») в предложении WHERE в Access (Jet, ACE и т. Д.).

При этом обратите внимание, что Access несовместим с SQL в том смысле, что он позволяет вам использовать as clause в предложении SELECT в направлении слева направо, например. это допустимо в Access SQL (но недопустимо в Standard SQL):

SELECT 2 AS a, 2 AS b, a + b AS c
  FROM tblMyTable
1 голос
/ 04 февраля 2011

Использовать подзапросы:

Select id,allMyText 
from
(SELECT stories.id, 
[stories.title] & " " & [stories.author] & " " 
& [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories ) as w
WHERE ((([allMyText]) Like "*apples*" And ([allMyText]) Not Like "*applesauce*"))
...