【问题标题】:SQL one value in list of values occurs at least once in listSQL 值列表中的一个值在列表中至少出现一次
【发布时间】:2015-05-18 01:30:07
【问题描述】:

查询是从 CompanyListings 中选择所有记录,其中 CompanyZip 列中的至少一个邮政编码在 CityToZipCodes 表的 ZipCodes 列中出现一次。 ZipCodes 和 CompanyZip 列都是 TEXT 数据类型,所有值始终是逗号分隔的数字列表。

CityToZipCodes
+----+---------+-----------------------------------+
| ID | City    | ZipCodes                          -
+----+---------+-----------------------------------+
|  1 | Atlanta | 30028, 30040, 30041, 30107, 30151 -
+----+---------+-----------------------------------+

CompanyListings
+-----+-------------------+----------------------+
| ID  | CompanyName       | CompanyZip           -
+-----+-------------------+----------------------+
|  11 | BBB HVAC Company  | 30028, 30188, 30107  -
|  12 | Americool         | 30520, 30151, 30041  -
+-----+-------------------+----------------------+

我根据其他 SO 问题使用 LIKE 和 IN 尝试了一些查询,但是当两个表列值都是逗号分隔列表时,它们不起作用。

SELECT * 
FROM CompanyListings
WHERE CompanyZip IN (SELECT ZipCodes
FROM CityToZipCodes
WHERE City = "Atlanta");

【问题讨论】:

  • 哎呀,与其编写复杂的查询,不如规范化你的数据模型。
  • 数据库不应该存储 CSV。而是创建查找表,例如 CompanyID | ZipCode,您将在其中为每个公司的每个 zip 提供一个条目。
  • 哦,这个查询将是一场噩梦,与具有标准化数据的查询相比,它只是一个连接......
  • 感谢您的所有回答。

标签: mysql sql


【解决方案1】:

您最好创建新表来存储公司 ID 和关联的每个邮政编码。对城市做同样的事情。在此之后,您可以通过适当的索引有效地使用 IN。

如果您必须对现有数据执行此操作,则需要创建一个小函数,该函数接受两个邮政编码字符串,当其中有任何匹配的邮政编码时返回 true。然后你可以使用这样的函数来连接这两个表:

 Select * from companylist c left join citylist t on match_zips(c.zips,t.zips)>0

会很慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多