CaptureRange

CaptureRange(first DOUBLE, last DOUBLE, xml_column TEXT, item_id INT)

Tai SQL funkcija, naudojama paieškai lentelės laukuose, kur duomenys yra saugomi XML formatu. Ji patikrina ar lentelės įrašo XML duomenų stulpelyje skaičius yra nurodytame intervale, pvz. [1988; 2009].

Panaudojimas

Sakykime, kad turime lentelės įrašą, kurio xml stulpelyje laikoma tokia tekstinė eilutė:

<item id="1">12</item>
<item id="2">1988</item>
<item id="3">3.14</item>

Ši užklausa grąžina teigiamą reikšmę, nes 1988 yra daugiau nei 1980 ir mažiau nei 2009:

SELECT CaptureRange(1980, 2009, xml, 2)

Ši užklausa grąžina neigiamą reikšmę, nes 1988 yra mažiau nei 1995 ar 2009:

SELECT CaptureRange(1995, 2009, xml, 2)

Kodas

CREATE FUNCTION CaptureRange (first DOUBLE, last DOUBLE, xml_column TEXT, item_id INT)
RETURNS BOOLEAN
DETERMINISTIC
BEGIN
  DECLARE numberStart INT;
  DECLARE numberEnd INT;
  DECLARE thisNumber DOUBLE;
  DECLARE phrase TEXT;
  DECLARE phraseLength INT;
  DECLARE thisResult BOOLEAN;
 
  SET phrase = CONCAT(‘<item id="’, item_id, ‘">’); – Kuriame eilutę su atidaryta XML žyme
  SET numberStart = LOCATE(phrase, xml_column) + CHAR_LENGTH(phrase); – Ieškome vietos kur baigiasi atidaroma žymė
 
  IF numberStart THEN – Don’t waste time if the opening tag was not found
    SET numberEnd = LOCATE(‘</item>’, xml_column, numberStart) – numberStart; – Ieškome XML žymės uždarymo (čia baigiasi skaičius)
    SET thisNumber = SUBSTRING(xml_column, numberStart, numberEnd); – Nuskaitome skaičių
 
    IF thisNumber >= first AND thisNumber <= last THEN SET thisResult = TRUE; – Vykdomas patikrinimas, ar skaičius yra intervale
    ELSE SET thisResult = FALSE;
    END IF;
  END IF;
 
  RETURN thisResult;
END

Pastaba: Ši SQL funkcija netinka paieškoje tarp daug įrašų, nes yra pernelyg lėta.