Access SQL Является ли атрибут строки частью другой строки в том же атрибуте строки той же таблицы? - PullRequest
0 голосов
/ 25 апреля 2019

В запросе на доступ, который выполняется драйвером Microsoft JET 4.0, я должен спросить, является ли строковый атрибут частью другой строки в том же строковом атрибуте той же таблицы?

The table

Пример: в приведенной выше таблице есть строковый атрибут name, и я хочу получить запрос, который дает мне все [Name] -слово, которые содержатся вдругое [Name] -слово (в этом примере я хочу получить хотя бы «Attack», но должно быть больше слов, чем просто это).

Я уже пробовал s.th.вот так:

SELECT [Name] 
FROM [t_object]
WHERE '%'+[Name]+'%' IN (SELECT [Name] FROM [t_object])

Я думал о том, возможно ли использовать функцию InStr в комбинации с LIKE, но я не знаю как.

Как мне найти все слова?в атрибуте [Имя], которые уже содержатся в другом слове?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

В Access символ подстановки, обозначающий любое количество символов, равен '*', а не '%'.Вы можете использовать оператор LIKE следующим образом:

SELECT [Name] 
FROM [t_object]
WHERE [Name] LIKE '*Attack*';

, который даст все значения столбца, которые содержат 'Attack'.Если вы хотите, чтобы все строки [Name], где это значение содержалось в другом [Name], вы можете использовать EXISTS:

SELECT t.[Name] 
FROM [t_object] AS t
WHERE EXISTS (
  SELECT 1 FROM [t_object] 
  WHERE [Name] <> t.[Name] AND 
  [Name] LIKE '*' + t.[Name] + '*'  
)

или с объединением, чтобы получить оба значения:

SELECT t.[Name] AS contained, tt.[Name] AS container 
FROM [t_object] AS t INNER JOIN [t_object] AS tt
ON t.[Name] <> tt.[Name] AND tt.[Name] LIKE '*' + t.[Name] + '*'
0 голосов
/ 25 апреля 2019

Ну, это потребует дополнительной работы, но я могу дать вам преимущество ...
Сначала я не могу понять, как вы можете сделать это за один раз ... Может быть, другие участники имеют лучшую идею, но это то, что я пытался.
Сначала вам нужно извлечь все слова в дополнительную таблицу. Давайте назовем ее NameWords
Таблица должна иметь такую ​​простую структуру
ID -> AutoNumber
NameWord -> ShortText
Здесь вы поместите все слова, которые у вас есть в Имя
1 атака
2 шаблона
Вы выполните левое соединение между вашей текущей таблицей и этой таблицей, используя InStr или Like, и вы получите все записи, которые совпадают с NameWords. (вместе с теми, которые не имеют) Я сделал небольшой тест на это, и он вернул все, как и ожидалось, используя этот

SELECT [t_object].*,NameWords.NameWord 
FROM [t_object] LEFT JOIN NameWordsON Instr(t_object.Name,NameWords.NameWord );
...