在 SELECT 中附加通配符 MySQL

Append wildcards in SELECT with MySQL

使用MySQL:

我有一个table'city': 编号,'name','serving' 包含:

'1', 'Athens', 'Athens, Etowah, Madisonville'
'2', 'Etowah', 'Etowah, Athens, Madisonville, Niota'
'3', 'Madisonville', 'Madisonville, Niota, Athens, Etowah'
'4', 'Soddy Daisy', 'Soddy Daisy, Decatur, Graysville'
'5', 'Signal Mountain', 'Signal Mountain, Walden, Jasper, Kimball'

我有一个 table 'zipcodes': 编号,'zipcode','cityname' 包含:

'1','00000','Athens'
'2', '00001', 'Dayton'
'3', '00002', 'Soddy Daisy'

所以在城市中,'serving' 是围绕主要城市 'name' 的以逗号分隔的区域字符串,从主要城市开始。

我可以使用以下语句从我的数据库中获取列表:

SELECT serving FROM `city` WHERE serving LIKE '%Athens%'

我要获取的是 'city' 列表中的主要城市 'name',其中 'cityname' 未提供服务。如果它返回一个列表,其中 'cityname' 按字符串中的位置排列优先级,那将是一大收获。最初的目标是确保我在城市的 'serving' 字段中涵盖邮政编码中的每个 'cityname'。

期望的输出 示例“00001”代顿 -(不在服务中):代顿

奖金; 然后在找到“00000”雅典时(正在服务):雅典、埃托瓦、麦迪逊维尔

我试过:

SELECT z.cityname FROM zipcodes z
WHERE z.cityname NOT IN (
    SELECT c.serving FROM city c
        WHERE c.serving LIKE CONCAT('''%',z.cityname,'%'''))

但这在城市 'serving' 列表中找不到任何匹配项。

我尝试以不同方式格式化字符串,但出现错误。

SELECT z.cityname FROM zipcodes z
WHERE z.cityname NOT IN (
    SELECT c.serving FROM city c
        WHERE c.serving LIKE '%' + z.cityname + '%')

所以我认为它在我的字符串中,因为通配符匹配失败了。因此,我们将不胜感激任何建议。

我的数据库经验主要是 MSSQL 并在此处搜索并且 google 没有呈现我正在寻找的关于为什么我的 SELECT 不起作用的内容。

谢谢!

编辑:为数据添加了更多样本tables

如果您想查找不是 "served" 的任何城市的邮政编码,您可以使用:

SELECT z.zipcode, z.cityname 
FROM zipcodes z
WHERE NOT EXISTS (
  SELECT * 
  FROM city c
  WHERE c.serving LIKE CONCAT('%',z.cityname,'%')
)

db-fiddle

您可以连接表并使用 CASE 表达式作为结果:

select z.*,
  case 
    when c.id is null then concat('(NOT IN serving): ', z.cityname)
    else concat('(IN serving): ', c.serving)
  end result 
from zipcodes z left join city c
on find_in_set(z.cityname, c.serving)
order by z.id

我使用函数 find_in_set() 而不是需要连接通配符的运算符 like

参见 demo.
结果:

| id  | zipcode | cityname    | result                                         |
| --- | ------- | ----------- | ---------------------------------------------- |
| 1   | 00000   | Athens      | (IN serving): Athens, Etowah, Madisonville     |
| 2   | 00001   | Dayton      | (NOT IN serving): Dayton                       |
| 3   | 00002   | Soddy Daisy | (IN serving): Soddy Daisy, Decatur, Graysville |