首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >搜索字符串并有条件地忽略连字符

搜索字符串并有条件地忽略连字符
EN

Stack Overflow用户
提问于 2018-11-09 10:07:53
回答 3查看 1.1K关注 0票数 1

关键词:usedredcars

我想列出这些行;

代码语言:javascript
运行
复制
used-red-cars-florida  
used-redcars-florida  
usedred-cars-florida  
usedredcars-florida  

编辑:我想列出包括keyword+dash+%在内的所有行(任何其他)

二手车-%

二手车可以包括任何破折号

代码语言:javascript
运行
复制
u-s-e-d-r-edcars-%  
used-r-e-dcars-%  
usedred-c-a-r-s-%  

通过这个问题,

代码语言:javascript
运行
复制
SELECT * FROM [TABLE]
where description LIKE keyword+'-%'  

我只得到;

代码语言:javascript
运行
复制
usedredcars-florida

我不想要这个;

代码语言:javascript
运行
复制
used-redcarsflorida
usedredcarsflorida
usedred-carsflorida

如何修改我的查询?

谢谢

更多的样本数据;

关键字:完全堆栈

全栈

全叠

全院

全堆栈应用程序

fullstackbigdata-com

全栈数据

全堆栈开发

全堆栈开发作业

全叠加数字代理

全栈执行

全叠节

全叠片

全叠金融

全叠-自由职业者

全栈it解决方案

全叠实验室

fullstackmarketing

全叠式营销

全堆栈-méxico

全叠投资组合

全叠-小规模有限公司

全堆栈资源

全叠滚装

全堆栈服务

全堆栈解决方案

fullstacksolutions.com

全叠人员配置

fullstackstud-io

全叠支撑

全堆栈技术

全栈-多伦多

例如,在这里,我想抛弃所有大胆的

EN

回答 3

Stack Overflow用户

发布于 2018-11-09 11:02:49

(这个答案假设您使用的是Server)

我认为您可以解决这个问题,一次替换一个-,看看是否能够找到与关键字完全匹配的关键字:

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2018-11-09 10:56:53

我在打电话,所以这是伪码.

代码语言:javascript
运行
复制
  SELECT
    *
  FROM
    [table]
  WHERE
        REPLACE('-', '', description) LIKE keyword + '%'
    AND description LIKE REPLACE(keyword, '%-', REPLACE('-', '', description))

将正确排除used-red-carflorida,但不包括used-red-car-florida-usa

这是我在Ansi中所能做的最好的事情。

票数 0
EN

Stack Overflow用户

发布于 2018-11-09 11:25:56

因为您没有指定DBMS,所以我认为它是Oracle。

这不是一个非常优雅的解决方案,但应该有效:

首先,创建一个将关键字转换为正则表达式的函数:

代码语言:javascript
运行
复制
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;

它以可选的破折号取代每个字符,并表示最终剩下的部分应该以破折号开头。

所以

代码语言:javascript
运行
复制
used

变成了

代码语言:javascript
运行
复制
[\-]*u[\-]*s[\-]*e[\-]*d([\-].*)?$

之后,执行查询

代码语言:javascript
运行
复制
SELECT *
FROM   my_table
WHERE  REGEXP_LIKE(description, keyword2re('fullstack'));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53223666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档