SQL加入不完美匹配

时间:2009-08-10 17:28:41

标签: sql

是否可以在SQL中匹配以下这些键的组合?

关键值如数组和分隔符='/'。

Key      
-----
A/B/C
A
B
C
A/B
A/C
B/C

6 个答案:

答案 0 :(得分:1)

我首先想到的是你需要重新设计。您不应该以这种方式存储数据。你应该有一个相关的表。然后你可以做普通的连接来得到你想要的东西。数据库设计的规则1是每个字段仅存储一条信息。如果您发现需要将其分解为比存储更小的块,则存储不正确。

一些提议的解决方案将起作用(取决于你真正要求的哪些不清楚)但是大多数(如果不是全部)它们将会很慢,因为它们依赖于不会使你使用索引的语法。这是指示重新设计的一个主要原因。您不希望系统无法使用索引。

答案 1 :(得分:0)

假设您的密钥是单个字母,如示例所示,您可以使用LIKE:

SELECT * FROM table WHERE key LIKE '%A%'

会为您提供“key”包含“A”的所有值。

答案 2 :(得分:0)

SELECT  *
FROM    mytable
WHERE   `key` REGEXP '^([ABC]/)*[ABC]?$'

这将匹配上面的任何内容,但如果有其他字母(例如D/B/CAA/BB/CC

则不匹配

答案 3 :(得分:0)

最好使用REGEXP

SELECT * FROM table WHERE key REGEXP '[[:<:]]A[[:>:]]'

[[:&lt ;:]]和[[:&gt;:]]标记一个单词边界,这将停止'A'匹配AB,AC,AD 我不确定它们是否是特定于mysql的

答案 4 :(得分:0)

什么数据库?

  • 如果与Oracle打交道,我建议使用INSTR
  • 对于SQL Server:CHARINDEX
  • mySQL也使用INSTR

使用其中任何一个来测试大于零的值。

SELECT t.*
  FROM TABLE t
 WHERE INSTR(t.column, expectedValue) > 0

答案 5 :(得分:0)

你没有说清楚你的问题。我认为这个键列表在概念上是重复排序的集合,并且您想要找到所有可能的子集/超集组合(例如,我认为您希望'A / C'“匹配”'A / B / C')。

这似乎有效,但我很难证明逻辑是正确的:

SELECT a.key subset, b.key superset
  FROM key_list a, key_list b
  WHERE '/' || REPLACE( b.key, '/', '//') || '/'
      LIKE  '/' || REPLACE( a.key, '/', '/%/' ) || '/'
     OR b.key LIKE '%' || a.key || '%'
  ORDER BY length(a.key), a.key, length(b.key),b.key