sql >> Database >  >> RDS >> Mysql

Coalesce-equivalent voor n-de niet-nulwaarde - MySQL

Ik weet niet zeker of ik het gebruik van deze oplossing zou aanbevelen ... normalisatie van uw gegevens is altijd een betere keuze, maar ik wilde antwoorden met gewone SQL met enkele tekenreeksfuncties. Deze zoekopdracht zou moeten opleveren wat u zoekt:

SELECT
  Name,
  Changes,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 1)), ',', 1)) as Change1,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 2)), ',', 1)) as Change2,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 3)), ',', 1)) as Change3,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 4)), ',', 1)) as Change4,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 5)), ',', 1)) as Change5,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 6)), ',', 1)) as Change6
FROM (
  SELECT
    Name,
    CONCAT_WS(',', CURRENT, OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12, ',') as Changes
  FROM
    TableA
) s

Ik voeg alle waarden samen in een door komma's gescheiden tekenreeks, met twee komma's aan het einde van de tekenreeks (één komma zou hoe dan ook voldoende zijn, maar het is gemakkelijker om er twee te plaatsen en de laatste gewoon te negeren ...), en aangezien ik' m met CONCAT_WS zal het automatisch null-waarden overslaan, en de resulterende string zal zoiets zijn als Aug-12,Jun-12,Apr-12,, .

Vervolgens extraheer ik in de buitenste query het n-de element van de string, met behulp van SUBSTRIG_INDEX. Ik zou aanraden om je database te normaliseren, maar als je een snelle oplossing nodig hebt, kan deze oplossing een goed startpunt zijn.

Zie het hier werken .

Houd er rekening mee dat ik geen NULL-waarden retourneert waar er geen wijzigingen zijn, maar in plaats daarvan lege tekenreeksen retourneert. Dit kan indien nodig worden gewijzigd.



  1. Hoe te voorkomen dat Activity Monitor de prestaties van uw SQL Server schaadt?

  2. Hoe te vinden waar de functie wordt gebruikt

  3. Sql:rijen omzetten in kolommen

  4. probleem met sql-syntaxis