Ищите строку и условно игнорируйте дефисы - PullRequest
0 голосов
/ 09 ноября 2018

ключевое слово: usedredcars

Я хочу перечислить эти строки;

used-red-cars-florida  
used-redcars-florida  
usedred-cars-florida  
usedredcars-florida  

РЕДАКТИРОВАТЬ: я хочу перечислить все строки, включая ключевое слово + тире +% (что-нибудь еще)

usedredcars -%
и использованные автомобили могут содержать любые тире

u-s-e-d-r-edcars-%  
used-r-e-dcars-%  
usedred-c-a-r-s-%  

С этим запросом,

SELECT * FROM [TABLE]
where description LIKE keyword+'-%'  

я получаю только;

usedredcars-florida

Я не хочу этого;

used-redcarsflorida
usedredcarsflorida
usedred-carsflorida

Как мне изменить мой запрос?

Спасибо

Больше образцов данных;

Ключевое слово: fullstack

fullstack
полный стек
fullstack-академии
полный стек-приложения
fullstackbigdata-ком
полный стек данных
fullstack-DEV
полный стек-разработчик-задания
fullstack цифровое агентство
полный стек-исполнительный
полный стек-фест
полный стек-фильмы
полный стек-финанс
fullstack-внештатный
fullstack-он-решения
fullstack-лаборатории
fullstackmarketing
полный стек-маркетинг
fullstack-México
полный стек-портфель
полный стек-псевдотерминал-лтд
полный стек-ресурсы
fullstack-ро
fullstack-услуги
полный стек-решений
fullstacksolutions.com
fullstack-кадровая
fullstackstud-ю
fullstack-поддержка
полный стек-технологии
полный стек-торонто

Например, здесь я хочу отказаться от всех смелых

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

(Этот ответ предполагает, что вы используете SQL Server)

Я думаю, что вы можете решить проблему, заменив одну - за раз, и посмотрите, сможете ли вы найти точное соответствие для ключевого слова:

DECLARE @t TABLE (id int, keyword VARCHAR(8000));
INSERT INTO @t VALUES
(1, 'usedredcars'),
(2, 'used-redcars'),
(3, 'usedred-cars'),
(4, 'used-red-cars'),
(5, 'florida-usedredcars'),
(6, 'usedredcars-florida'),
(7, 'florida-usedredcars-florida'),
(8, 'rarelyused-red-cars'),
(9, 'used-red-carshops');

WITH cte AS (
    -- pad the seed string with hyphens to simplify edge case handling
    SELECT id, keyword, '-' + keyword + '-' AS search
    FROM @t AS base

    UNION ALL

    -- replace hyphens from the middle one at a time
    SELECT id, keyword, STUFF(search, CHARINDEX('-', search, 2), 1, '')
    FROM cte AS prev
    WHERE NULLIF(CHARINDEX('-', search, 2), LEN(search)) > 0

    -- BE ADVISED that STUFF can return unexpected size varchar and thus:
    -- Types don't match between the anchor and the recursive part
    -- explicitly cast the result to desired size if that happens
)
SELECT *
FROM cte
WHERE search LIKE '%-usedredcars-%'

DB Fiddle

0 голосов
/ 09 ноября 2018

Поскольку вы не указали свою СУБД, я считаю это Oracle.
Это не очень элегантное решение, но оно должно работать:

Сначала создайте функцию, которая преобразует ключевое слово в регулярное выражение:

CREATE OR REPLACE FUNCTION keyword2re
(
  p_kw IN VARCHAR2
)
RETURN VARCHAR2
AS
  v_result VARCHAR2(1000);
  v_length INTEGER;
  v_count  INTEGER;
BEGIN

  v_length := LENGTH(p_kw);
  FOR v_count IN 1..v_length LOOP
    v_result := v_result || '[\-]*' || SUBSTR(p_kw, v_count, 1);
  END LOOP;
  v_result := v_result || '([\-].*)?$';
  RETURN v_result;

END keyword2re;

Он предшествует каждому символу дополнительными тире и говорит, что оставшаяся часть должна начинаться с тире.

So

used

становится

[\-]*u[\-]*s[\-]*e[\-]*d([\-].*)?$

После этого выполнить запрос

SELECT *
FROM   my_table
WHERE  REGEXP_LIKE(description, keyword2re('fullstack'));
0 голосов
/ 09 ноября 2018

Я на своем телефоне, так что это псевдокод ...

  SELECT
    *
  FROM
    [table]
  WHERE
        REPLACE('-', '', description) LIKE keyword + '%'
    AND description LIKE REPLACE(keyword, '%-', REPLACE('-', '', description))

Правильно исключит used-red-carflorida, но не будет включать used-red-car-florida-usa

Это лучшее, что я могу сделать в Ansi SQL.

...