【问题标题】:Sql Un-Wizardry: Compare values from one list in anotherSql Un-Wizardry:比较另一个列表中的值
【发布时间】:2009-05-05 17:57:14
【问题描述】:

我想在 SQL 中进行更高效的比较。

输入字段(fldInputField)是逗号分隔的“1,3,4,5”列表

数据库有一个字段(fldRoleList),其中包含“1,2,3,4,5,6,7,8”

所以,对于 fldRoleList 中第一次出现的 fldInputField,请告诉我们它是哪个值。

有没有办法在 MySQL 或存储过程中实现以下功能?

伪代码

选择 * 从表 t1 WHERE fldInputField in t1.fldRoleList

/伪代码

我猜可能有一些函数最适合这种类型的比较?我在搜索中找不到任何内容,如果有人可以指导我,我会删除问题...谢谢!

更新:这不是理想的(或好的)做事方式。它是继承的代码,我们只是尝试快速修复,同时考虑构建逻辑以通过规范化行来处理这个问题。幸运的是,这不是大量使用的代码。

【问题讨论】:

  • 我不太清楚你想要什么。您能否给出一些示例值和您期望看到的结果?例如,使用您给定的值,正确的结果是否会是“1”,因为“1”出现在两个列表中?

标签: sql mysql list comparison


【解决方案1】:

我同意@Ken White 的answer 的观点,即逗号分隔的列表在标准化数据库设计中没有位置。

如果您将fldRoleList 存储为依赖表中的多行,则解决方案会更简单并且性能会更好:

SELECT t1.*, r1.fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField);

(见MySQL函数FIND_IN_SET()

但如果多个角色与逗号分隔的输入字符串匹配,则会输出多行。如果您需要将结果限制为每个 aTable 条目一行,并使用 first 匹配角色:

SELECT t1.*, MIN(r1.fldRole) AS First_fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField);
GROUP BY t1.aTable_id;

【讨论】:

  • 困惑,find_in_set 对非规范化解决方案有用吗?问题似乎是要求 first 值?
  • find_in_set() 函数在逗号分隔的字符串中查找 one 值。 OP 的问题是将一个逗号分隔的字符串与第二个逗号分隔的字符串进行比较,并找到第一个匹配项。 Find_in_set() 不能这样做。我的示例使用规范化表格设计来提供帮助。
  • 谢谢比尔。它是继承的代码,我们正在考虑将 fldRoleList 存储在多行中......必须创建添加/删除行逻辑才能做到这一点,并且在我们重新工作时需要快速修复。
【解决方案2】:

你知道,你的架构设计很糟糕。逗号分隔的列表在数据库中没有任何业务。

话虽这么说...您正在寻找 LIKE。

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE fldInputField + '%'

如果内容开头可能不总是匹配,请在 fldInputField 之前添加另一个百分号。

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE '%' + fldInputField + '%'

【讨论】:

  • 或者建一个临时表,照常做。
  • 如果你在寻找 1,你会找到 11 使用这个解决方案
  • @Andomar,没有。查看 OP 中的示例数据 - 它是一个逗号分隔的列表,OP 说他正在寻找包含多个值的列表中的多个值。在包含“2,3,4,5,11”的列中查找“1,2,3”与“11”不匹配,如果您要查找“1”,则不匹配要么。
  • 这是继承的代码.. 试图摆脱它。我愿意以另一种方式做到这一点!
  • 我想在 11,22 中寻找 1,2 会找到它。但我假设列表在某些情况下只能包含一个数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2021-06-10
相关资源
最近更新 更多