1

我认为这是一个非常简单的问题,但我无法找出正确的搜索词来搜索它。这个问题是我能找到的最相似的问题,但这与我想要做的相反。

我有这样的查询:

SELECT * FROM table WHERE column LIKE "val1%" OR column LIKE "val2%" OR column LIKE "val3%", ...so..on..and..on

由于它是 OR,因此只有其中一些会从列中给出匹配项。

如何使用查询本身返回匹配的 LIKE 子句?像这样 :

SELECT *, (val1 or val2 or val3 - the matched val) FROM table WHERE column LIKE "val1%" OR column LIKE "val2%" OR column LIKE "val3%", ...so..on..and..on

由于匹配是通过通配符“%”进行的,所以我需要得到匹配的确切值。

如果表是这样的:

姓名 年龄
麦克风 1
约翰 2
迈克尔 3
米琳达 4

如果查询是:

SELECT *, (the matched value) FROM table WHERE name LIKE "Mik%" OR name LIKE "Mic%" OR name LIKE "mia%"

它会返回:

姓名 年龄 匹配
麦克风 1 米克
迈克尔 3 麦克风

这是否可能纯粹使用SQLite查询?我知道这可以在获得结果后稍后完成,但想要删除冗余,因为 SQLite 无论如何都已经匹配了。

注意:表很大。100,000+ 行。因此,性能是尽快获得结果的一个重要因素。OR 条件也可以是 5 或 10 或 15+

4

2 回答 2

1

使用您拥有的所有匹配字符串创建一个 CTE 并加入该表:

WITH cte(match) AS (VALUES ('Mik'), ('Mic'))
SELECT t.*, c.match
FROM tablename t INNER JOIN cte c
ON t.name LIKE c.match || '%'

请参阅演示

于 2021-08-01T12:32:04.823 回答
1

您可以使用大小写表达式。请参阅下面的工作小提琴:

架构(SQLite v3.30)

CREATE TABLE my_table (
  `name` VARCHAR(7),
  `age` INTEGER
);

INSERT INTO my_table
  (`name`, `age`)
VALUES
  ('Mike', '1'),
  ('John', '2'),
  ('Michael', '3'),
  ('Milinda', '4');

查询 #1

SELECT 
     *, 
     CASE
         WHEN  name LIKE "Mik%" THEN "Mik"
         WHEN  name LIKE "Mic%" THEN "Mic"
         WHEN  name LIKE "mia%" THEN "mia"
     END as matched_value
FROM 
     my_table 
WHERE 
    name LIKE "Mik%" OR 
    name LIKE "Mic%" OR 
    name LIKE "mia%";
姓名 年龄 匹配值
麦克风 1 米克
迈克尔 3 麦克风

在 DB Fiddle 上查看

于 2021-08-01T12:17:28.050 回答