关键词:usedredcars
我想列出这些行;
used-red-cars-florida
used-redcars-florida
usedred-cars-florida
usedredcars-florida
编辑:我想列出包括keyword+dash+%在内的所有行(任何其他)
二手车-%
二手车可以包括任何破折号
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
如何修改我的查询?
谢谢
更多的样本数据;
关键字:完全堆栈
全栈
全叠
全院
全堆栈应用程序
fullstackbigdata-com
全栈数据
全堆栈开发
全堆栈开发作业
全叠加数字代理
全栈执行
全叠节
全叠片
全叠金融
全叠-自由职业者
全栈it解决方案
全叠实验室
fullstackmarketing
全叠式营销
全堆栈-méxico
全叠投资组合
全叠-小规模有限公司
全堆栈资源
全叠滚装
全堆栈服务
全堆栈解决方案
fullstacksolutions.com
全叠人员配置
fullstackstud-io
全叠支撑
全堆栈技术
全栈-多伦多
例如,在这里,我想抛弃所有大胆的
发布于 2018-11-09 11:02:49
(这个答案假设您使用的是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-%'
发布于 2018-11-09 10:56:53
我在打电话,所以这是伪码.
SELECT
*
FROM
[table]
WHERE
REPLACE('-', '', description) LIKE keyword + '%'
AND description LIKE REPLACE(keyword, '%-', REPLACE('-', '', description))
将正确排除used-red-carflorida
,但不包括used-red-car-florida-usa
这是我在Ansi中所能做的最好的事情。
发布于 2018-11-09 11:25:56
因为您没有指定DBMS,所以我认为它是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;
它以可选的破折号取代每个字符,并表示最终剩下的部分应该以破折号开头。
所以
used
变成了
[\-]*u[\-]*s[\-]*e[\-]*d([\-].*)?$
之后,执行查询
SELECT *
FROM my_table
WHERE REGEXP_LIKE(description, keyword2re('fullstack'));
https://stackoverflow.com/questions/53223666
复制相似问题