Question

Je suis bloqué en essayant de combiner un like avec une jointure gauche dans Sybase.

Par exemple (même si dans mon cas c'est un peu plus compliqué), je recherche du texte qui ne contient ni o ni i.

Je suis capable de faire le contraire, c'est-à-dire du texte contenant l'une de ces lettres:

select numbers.name from 
(
      select 'one'   name union all
      select 'two'   name union all
      select 'three' name union all -- neither %o% nor %i%
      select 'four'  name union all
      select 'five'  name union all
      select 'six'   name union all
      select 'seven' name union all -- neither %o% nor %i%
      select 'eight' name union all
      select 'nine'  name union all
      select 'ten'   name           -- neither %o% nor %i%
) numbers,
(
      select '%o%'  expression union all
      select '%i%'  expression       
) patterns
where
  numbers.name like patterns.expression

sélectionne tous les enregistrements sauf three, seven et ten comme prévu.

Maintenant, je cherche un moyen de trouver ces trois disques.J'ai pensé à joindre à gauche des nombres avec des motifs , puis à filtrer l'expression étant nulle.Quelque chose comme ça:

numbers.name *like patterns.expression and
patterns.expression is null

De toute évidence, cela ne fonctionne pas.Donc, je serais heureux pour tout pointeur donné dans la bonne direction.

Pour ce que ça vaut, voici la version sur laquelle je travaille:

select @@version
'Adaptive Server Enterprise/15.0.3/EBF 17156 ESD#3/P/Sun_svr4/OS 5.8/ase1503/2726/64-bit/FBO/Fri Feb  5 05:26:23 2010'
Était-ce utile?

La solution

Vous devriez utiliser NOT EXISTS (c'est le cas):

select numbers.name from 
(
      select 'one'   name union all
      select 'two'   name union all
      select 'three' name union all -- neither %o% nor %i%
      select 'four'  name union all
      select 'five'  name union all
      select 'six'   name union all
      select 'seven' name union all -- neither %o% nor %i%
      select 'eight' name union all
      select 'nine'  name union all
      select 'ten'   name           -- neither %o% nor %i%
) numbers
where not exists (select null
                    from (
                             select '%o%'  expression union all
                             select '%i%'  expression
                         ) patterns
                   where numbers.name like patterns.expression)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top