在 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,'%')
)
您可以连接表并使用 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 |
使用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,'%')
)
您可以连接表并使用 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 |