0
votes

comment utiliser LIKE au lieu de IN avec plusieurs valeurs?

Je souhaite remplacer In par Like pour que la requête fonctionne.

SELECT  
    1 AS coddit, COD_CAT AS cam_cod, DES_CAT AS cam_desc, 
    LIVELLO_CAT AS livello, COD_CAT_PADRE AS cat_padre,
    COD_L1, COD_L2, COD_L3, COD_L4, COD_L5, COD_L6
FROM
    dbo.CLASS_ART
WHERE
    1=1 
    AND TIPO_CLASS = 16 --B2B
    AND LIVELLO_CAT = '0'
    AND COD_CAT IN (SELECT DISTINCT CAT_MERCE.COD_CAT
                    FROM ART_LIST_PREZZI 
                    INNER JOIN ART_ANA ON ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART
                    INNER JOIN CAT_MERCE ON ART_ANA.COD_CAT = CAT_MERCE.COD_CAT
                                         AND ART_LIST_PREZZI.COD_LIST = 'EXPORT_002')

La comparaison que je voudrais faire avec LIKE sinon la requête ne fonctionne pas bien la sous-requête renvoie plus d'une valeur et elle est correcte mais si j'utilise Like au lieu de IN, j'ai ce message d'erreur:

La requête renvoie plus d'une valeur


8 commentaires

vous êtes sûr que la requête est à l'origine de cette erreur? comme COD_CAT IN (sélectionnez DISTINCT CAT_MERCE.COD_CAT à partir de ART_LIST_PREZZI ..) devrait fonctionner correctement.


la requête fonctionne mais je veux supprimer In et mettre Like


... vous avez probablement également étiqueté le mauvais SGBDR. Comme l'utilisation de dbo suggère probablement que vous utilisez SQL Server (MSSQL) et non MySQL.


Une "sous-requête IN" peut renvoyer plusieurs lignes.


Des vues impliquées?


pour la comparaison j'ai besoin de LIKE au lieu de IN


Voir Pourquoi Dois-je fournir un exemple minimal reproductible pour une requête SQL très simple? alors nous pouvons commencer à donner des réponses solides.


vérifiez ici: stackoverflow.com/ questions / 1865353 /…


3 Réponses :


3
votes

L'utilisation de LIKE contre une sous-requête qui renvoie plusieurs enregistrements ne fonctionnera pas. Une solution serait de transformer la condition IN en une condition EXISTS , comme:

and exists (
    select 1
    from  ART_LIST_PREZZI 
    inner join ART_ANA 
        on ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART
    inner join CAT_MERCE 
        on ART_ANA.COD_CAT = CAT_MERCE.COD_CAT 
        and ART_LIST_PREZZI.COD_LIST = 'EXPORT_002'
    where COD_CAT like '%' + CAT_MERCE.COD_CAT + '%'
)


0 commentaires

0
votes

Comme doit être comparé à une seule chaîne, vous devez donc définir tous vos identifiants sur une seule chaîne. Vous pouvez le faire en utilisant la clause for xml.

AND
  (SELECT DISTINCT ',' + CAST(CAT_MERCE.COD_CAT AS VARCHAR(32)) + ','
   FROM ART_LIST_PREZZI 
        INNER JOIN ART_ANA ON ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART
        INNER JOIN CAT_MERCE ON ART_ANA.COD_CAT = CAT_MERCE.COD_CAT
                                AND ART_LIST_PREZZI.COD_LIST = 'EXPORT_002'
   FOR XML PATH('')) LIKE '%,' + COD_CAT + ',%'

Maintenant, je délimiterais vos identifiants par des virgules, afin que vous ne trouviez pas de faux positifs, et je les comparerais en utilisant like.

(SELECT DISTINCT CAST(CAT_MERCE.COD_CAT AS VARCHAR(32))
 FROM ART_LIST_PREZZI 
      INNER JOIN ART_ANA ON ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART
      INNER JOIN CAT_MERCE ON ART_ANA.COD_CAT = CAT_MERCE.COD_CAT
                              AND ART_LIST_PREZZI.COD_LIST = 'EXPORT_002'
 FOR XML PATH(''))

Cela fonctionnerait, et vous auriez changé votre opérateur IN avec un opérateur LIKE, mais je n'en vois pas l'intérêt, ses performances seraient pires que votre requête d'origine.


0 commentaires

0
votes

Utilisez EXISTS:

                CLASS_ART.COD_CAT LIKE CONCAT('%', M.COD_CAT, '%')

Je suppose que la logique que vous voulez réellement utilise des caractères génériques:

EXISTS (SELECT 1
        FROM ART_LIST_PREZZI LP JOIN
             ART_ANA A
             ON LP.COD_ART = A.COD_ART JOIN
             CAT_MERCE M
             ON A.COD_CAT = M.COD_CAT AND
                LP.COD_LIST = 'EXPORT_002' AND
                CLASS_ART.COD_CAT LIKE M.COD_CAT
       )

Si tel est le cas, cela suggère un problème avec le modèle de données. Pourquoi deux colonnes portant le même nom ( COD_CAT ) doivent-elles être jointes en utilisant LIKE au lieu de =.


0 commentaires