2009-08-10 9 views
1

Est-il possible de faire correspondre la combinaison suivante de ces clés dans SQL?Connexion SQL avec correspondance imparfaite

Les valeurs de clé comme un tableau et un délimiteur = '/'.

Key  
----- 
A/B/C 
A 
B 
C 
A/B 
A/C 
B/C 
+3

Pouvez-vous préciser ce que vous espérez faire correspondre? Est la valeur dans la base de données et vous voulez faire correspondre une entrée? –

+2

qu'est-ce que vous essayez de faire correspondre ?? 'b' = 'a/b/c' ?? ou 'a/b/c' = 'a/b/c' ??? ou autre chose?? –

Répondre

0

En supposant ici vos clés sont des lettres simples comme dans votre exemple, vous pouvez utiliser LIKE:

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

Souhaitez-vous donner toutes les valeurs où « clé » contient « A ».

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

Cela correspondra tout en haut, mais ne correspond pas à s'il y a d'autres lettres (comme D/B/C ou AA/BB/CC)

0

Vous feriez mieux d'utiliser REGEXP

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

[[: <:]] et [[:>:]] marquer une limite de mot, cela arrêtera 'A' correspondant AB, AC, AD Je ne suis pas sûr si elles sont spécifiques à mysql

0

Quelle base de données?

  • Si vous traitez avec Oracle, je suggère d'utiliser INSTR
  • Pour SQL Server: CHARINDEX
  • mySQL utilise également INSTR

Utilisez l'un de ceux pour tester une valeur supérieure à zéro.

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

Vous n'avez pas énoncé votre problème très clairement. Je suppose que cette liste de clés représente conceptuellement les ensembles ordonnés, et que vous voulez trouver toutes les combinaisons de sous-ensembles/supersets possibles (par exemple, je pense que vous voulez que 'A/C' soit '' A/B/C '').

Cela semble fonctionner mais je serait difficile de prouver que la logique est droite:

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 
1

Ma première pensée vous est que vous devez redessiner. Vous ne devriez pas stocker de données de cette façon. Vous devriez avoir une table liée à la place. Ensuite, vous pouvez faire des jointures ordinaires pour obtenir ce que vous voulez. Règle 1 de la conception de la base de données est de stocker une seule information par champ. Si vous trouvez que vous avez besoin de décomposer en plus petits morceaux que vous stockez, vous stockez incorrectement. Certaines des solutions proposées fonctionneront (en fonction de ce que vous demandez vraiment qui n'est pas clair) mais la plupart sinon toutes seront lentes car elles reposent sur une syntaxe qui ne vous permettra pas d'utiliser des index. C'est l'une des principales raisons pour lesquelles une refonte est indiquée. Vous ne voulez pas d'un système où les index ne peuvent pas être utilisés.

Questions connexes