我创建了一个包含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)
有什么建议吗?我觉得应该很容易,但我找不到有效的方法。
谢谢!
答案 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
但是,基本建议仍然存在:创建一个联结表,这样你就不会在一个字符串中存储事物列表。