web-dev-qa-db-fra.com

Cas MySQL dans l'instruction Select avec l'opérateur LIKE

Est-il possible de combiner l'instruction CASE et l'opérateur LIKE dans une instruction MySQL SELECT?

Par exemple, j'essaie d'interroger une base de données qui stocke les données dans une seule colonne dans l'un des deux formats (c'est horrible et me fait mal à la tête, mais je ne peux pas changer les données pour qu'elles soient comme elles sont.) Ainsi, parfois, la colonne numbers aurait des données du type "6901xxxxxxxx" et parfois des données du type "91xxxxxxxxxxx".

Ce que je voudrais faire, c'est interroger les données comme suit -

SELECT
    CASE digits
      WHEN LIKE "6901%" THEN substr(digits,4)
      WHEN LIKE "91%" THEN substr(digits,2)
    END as "digits",
FROM raw

Cela ne fonctionne évidemment pas, mais j'espère que c'est possible.

37
HurnsMobile

Utiliser la seconde forme de CASE devrait fonctionner:

SELECT
  CASE
    WHEN digits LIKE '6901%' THEN substr(digits,4)
    WHEN digits LIKE '91%' THEN substr(digits,2)
  END as digits
FROM raw

De plus, vous avez une virgule parasite à la fin de votre SELECT.

72
Daniel Vandersluis

Essayer

SELECT
    CASE true
      WHEN digits LIKE "6901%" THEN substr(digits,4)
      WHEN digits LIKE "91%" THEN substr(digits,2)
    END as "digits",
FROM raw
6
Tim

Peut-être utiliser LEFT()?

SELECT
    CASE 
      WHEN LEFT(digits, 4) = '6901' THEN substr(digits,4)
      WHEN LEFT(digits, 2) = '91' THEN substr(digits,2)
    END 
FROM raw

Devrait être plus performant que le LIKE.

4
p.campbell

En supposant que le nombre de chiffres soit constant, vous pouvez utiliser quelque chose comme ceci:

SELECT IF(digits > 919999, MOD(digits, 100), MOD(digits, 10000) FROM raw

Ajoutez 0 pour correspondre à votre nombre actuel de chiffres. 

0
Joshua Martell