2009-05-05 47 views
1

我有一个比较我想在SQL中提高效率。Sql Un-Wizardry:比较另一个列表中的值

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

该数据库的列表具有字段(fldRoleList),其中包含“1,2,3,4,5, 6,7,8“

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

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

伪代码

SELECT * FROM T1 aTable WHERE 在fldInputField t1.fldRoleList

/伪代码

我猜测可能有一些功能是最适合这种比较?我在搜索中找不到任何东西,如果有人能指导我,我会删除这个问题......谢谢!

更新:这不是理想的(或好的)做事情的方式。它是继承的代码,我们只是简单地试图快速修复,而我们看着构建逻辑来通过规范化的行来处理这个问题。幸运的是,这不是大量使用的代码。

+0

我不是你想要的东西完全清楚。你能否给出一些示例值和你期望看到的结果?例如,使用给定的值将正确的结果是“1”,因为“1”出现在两个列表中? – 2009-05-05 18:11:44

回答

3

我@Ken白色的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项,与第一匹配的角色:

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; 
2

你有一个可怕的模式设计,你知道。逗号分隔的列表在数据库中没有业务。

这就是说...你在找LIKE。

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

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

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

或者构建临时表并执行常规操作。 – dkretz 2009-05-05 18:16:20

+0

如果你正在寻找1,你会发现11使用这种解决方案 – Andomar 2009-05-05 20:12:06