SQL-соединение с несовершенным соответствием - PullRequest
1 голос
/ 10 августа 2009

Можно ли сопоставить следующую комбинацию таких ключей в SQL?

Значения ключа, такие как массив и разделитель = '/'.

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

Ответы [ 6 ]

1 голос
/ 10 августа 2009

Моя первая мысль о том, что вам нужно изменить дизайн. Вы не должны хранить данные таким образом. Вместо этого у вас должна быть связанная таблица. Тогда вы можете делать обычные соединения, чтобы получить то, что вы хотите. Правило 1 проектирования базы данных - хранить только один фрагмент информации в каждом поле. Если вы обнаружите, что вам нужно разбить это на более мелкие куски, чем вы храните, вы храните неправильно.

Некоторые из предложенных решений будут работать (в зависимости от того, что вы действительно спрашиваете, что не ясно), но большинство, если не все, будут медленными, поскольку полагаются на синтаксис, который не позволит вам использовать индексы. Это одна из основных причин, почему указывается редизайн. Вам не нужна система, в которой индексы не могут быть использованы.

0 голосов
/ 10 августа 2009

Вы не очень четко изложили свою проблему. Я полагаю, что этот список ключей концептуально соответствует упорядоченным наборам, и вы хотите найти все возможные комбинации подмножеств / надмножеств (например, я думаю, что вы хотите, чтобы «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
0 голосов
/ 10 августа 2009

Какая база данных?

  • При работе с Oracle я предлагаю использовать INSTR
  • Для SQL Server: CHARINDEX
  • MySQL также использует INSTR

Используйте любой из них для проверки значения больше нуля.

SELECT t.*
  FROM TABLE t
 WHERE INSTR(t.column, expectedValue) > 0
0 голосов
/ 10 августа 2009

Вам будет лучше использовать REGEXP

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

[[: <:]] и [[:>:]] помечают границу слова, это останавливает 'A', сопоставляя AB, AC, AD Я не уверен, являются ли они специфичными для mysql

0 голосов
/ 10 августа 2009
SELECT  *
FROM    mytable
WHERE   `key` REGEXP '^([ABC]/)*[ABC]?$'

Это будет соответствовать чему-либо сверху, но не будет соответствовать, если есть другие буквы (например, D/B/C или AA/BB/CC)

0 голосов
/ 10 августа 2009

Предполагая, что здесь ваши ключи представляют собой отдельные буквы, как в вашем примере, вы можете использовать LIKE:

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

Даст вам все значения, где «ключ» содержит «А».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...