Выберите слово из столбца таблицы, если оно не заключено в квадратные, круглые или фигурные скобки - PullRequest
0 голосов
/ 08 декабря 2018

Используя Like Я могу написать следующий запрос SQL для выбора строки, только если в столбце input есть слово help.

select * 
from entry
where input like '% help %'
   or input like 'help %'
   or input like '% help'

Как изменить этот запрос SQL для выбора строк, еслиhelp не внутри [] или () или {}.

Пример данных:

+-------------------------------------------------------------+
|                            input                            |
+-------------------------------------------------------------+
| this is help { some help }                                  |
| help                                                        |
| another help [ help ]                                       |
| some text ( some words surrounding help. just for example ) |
| [ see help ] some text                                      |
| this is a sentence. { help }                                |
+-------------------------------------------------------------+

Ожидаемые результаты:

+----------------------------+
|           result           |
+----------------------------+
| this is help { some help } |
| help                       |
| another help [ help ]      |
+----------------------------+

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Я пришел к этому:

select * 
from entry
where  
    trim(input) = 'help' or
    input like 'help %' or 
    input like '% help' or
    replace(replace(replace(replace(input, '[', '('), '{', '('), ']', ')'), '}', ')') like '% help %(%)%' or 
    replace(replace(replace(replace(input, '[', '('), '{', '('), ']', ')'), '}', ')') like '%(%)% help %' or
    (input like '% help %' AND instr(replace(replace(replace(replace(input, '[', '('), '{', '('), ']', ')'), '}', ')'), '(') = 0)

при условии, что есть только 1 пара (), [] или {} в input.

0 голосов
/ 09 декабря 2018

Это простое решение:

SELECT * FROM entry
WHERE input LIKE 'help%'
OR input LIKE '%help'
OR input LIKE '%help%'
AND input NOT LIKE '%(%help%)%'
AND input NOT LIKE '%{%help%}%'
AND input NOT LIKE '%[%help%]%'

Результат похож на this

0 голосов
/ 09 декабря 2018

Попробуйте это

WITH entry AS
(
  SELECT 'this is help { some help }' input
  UNION
  SELECT 'help'
  UNION
  SELECT 'another help [ help ]'
  UNION  
  SELECT 'some text ( some words surrounding help . just for example )'
  UNION
  SELECT '[ see help ] some text'
  UNION
  SELECT 'this is a sentence. { help }' 
)
SELECT input
FROM
(
    SELECT input,
           CASE WHEN InStr(input, '[') > 0 THEN
                     InStr(input, '[')
                ELSE
                (CASE WHEN InStr(input, '(') > 0 THEN
                           InStr(input, '(')
                      ELSE InStr(input, '{')
                 END)
           END Idx,
           InStr(input, 'help') IdxH
   FROM entry
)
WHERE (Idx = 0 OR Idx > IdxH);

Так как, если слово help встречается после ], ), }, тогда

WITH entry AS
(
  SELECT 'this is help { some help }' input
  UNION
  SELECT 'help'
  UNION
  SELECT 'another help [ help ]'
  UNION  
  SELECT 'some text ( some words surrounding help . just for example )'
  UNION
  SELECT '[ see help ] some text'
  UNION
  SELECT 'this is a sentence. { help }' 
  UNION
  SELECT 'Asking for [help]. help me'
)
SELECT input
FROM
(
    SELECT input,
           CASE WHEN InStr(input, '[') > 0 THEN
                     InStr(input, '[')
                ELSE
                (CASE WHEN InStr(input, '(') > 0 THEN
                           InStr(input, '(')
                      ELSE InStr(input, '{')
                 END)
           END Idx,
           CASE WHEN InStr(input, ']') > 0 THEN
                     InStr(input, ']')
                ELSE
                (CASE WHEN InStr(input, ')') > 0 THEN
                           InStr(input, ')')
                      ELSE InStr(input, '}')
                 END)
           END Ix,
           InStr(input, 'help') IdxH
   FROM entry
)
WHERE (Idx = 0 OR Idx > IdxH OR InStr(SubStr(input, Ix), 'help') > 0)

Возвращает:

+----------------------------+
|           input            |
+----------------------------+
| Asking for [help]. help me |
| another help [ help ]      |
| help                       |
| this is help { some help } |
+----------------------------+

Демо

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