在代码列表中查找代码

时间:2015-03-27 13:50:56

标签: sql

我创建了一个包含8位代码(code)的列"8MKL98LO"和另一个list_of_codes的表,其中包含一串8位代码(即"8MKL98LO", "89FLOP7P")。我需要做一个select语句,告诉我第一个代码是否包含在具有多个代码的另一个列中。

如果我在第二列中总是使用相同的代码,我可以执行以下操作:

IF(code in ("8MKL98LO", "89FLOP7P"), 1, 0)

但如果我尝试这样的话,它就不起作用了:

IF(code in list of codes, 1, 0) 

有什么建议吗?我觉得应该很容易,但我找不到有效的方法。

谢谢!

2 个答案:

答案 0 :(得分:0)

根据影响实际语法的数据库,我只使用LIKE运算符,即:

select * from TABLE where LIST_OF_CODES like concat('%', CODE, '%');

或:

select case when LIST_OF_CODES like concat('%', CODE, '%') then 1 else 0 end from TABLE;

第一个只显示代码列表中包含代码的行,第二个显示所有行,但只给出匹配的行的特定标志,在本例中为1。

答案 1 :(得分:0)

第一个建议是不将事物列表存储为字符串。如果需要列表,请使用表 - 这就是关系数据库的设计方式。这样的表每个代码和每个实体将有一行,因此一行中的行将有多行。

如果出于某种原因你仍然坚持你所描述的结构,那么基本的解决方案是:

where ',' || list_of_codes || ',' like '%,' || code || ',%'

注意两边都使用分隔符。这是一项预防措施。因为你的所有代码都是8个字符,并且(大概)不包含逗号,所以这不是绝对必要的,所以:

where list_of_codes like '%' || code || '%'

在这种情况下也适用。如果有一天会引入7个字符或9个字符的代码,那就太危险了。

另请注意,||用作字符串连接。这因数据库而异,因此它可能是+concat()函数,甚至可能是&

某些数据库具有内置函数来执行此操作。例如,在MySQL中你可以写:

where find_in_set(code, list_of_codes) > 0

但是,基本建议仍然存在:创建一个联结表,这样你就不会在一个字符串中存储事物列表。