Question

In the following statement:

SELECT placeId, name, ico, lv, url
FROM
(
    SELECT placeId, urlRef, name, ico, lv
    FROM
    (
        SELECT placeId, urlRef, name, ico, levenshtein_ratio( :place, name ) AS lv
        FROM places
        WHERE name SOUNDS LIKE :place AND dm( name ) = dm( :place )
        HAVING lv > 59
        UNION
        SELECT placeId, urlRef, placeNameVariants.name AS name, ico, levenshtein_ratio( :place, placeNameVariants.name ) AS lv
        FROM placeNameVariants
        LEFT JOIN places ON placeRef = placeId
        WHERE placeNameVariants.name SOUNDS LIKE :place AND dm( placeNameVariants.name ) = dm( :place )
        HAVING lv > 59
        UNION
        SELECT placeId, urlRef, name, ico, 0 AS lv
        FROM places
        WHERE name REGEXP :placeLike
    ) AS subA
    ORDER BY lv DESC
) As subB
LEFT JOIN urls ON urlRef = urlId
GROUP BY placeId

I only want to run the SELECT after the third UNION (line 20) when a string is more than 3 characters, e.g.

IF( CHAR_LENGTH( :placeLike ) > 3 ) THEN
UNION
SELECT placeId, urlRef, name, ico, 0 AS lv
FROM places
WHERE name REGEXP :placeLike

But I cannot find any way of doing this. Is there a way? Or a best practice here. At the moment I am sending '^$' to the REGEXP when :placeLike is 3 ro less chars, which doesn't seem like a great solution.

Was it helpful?

Solution

have you tried this?

UNION
SELECT placeId, urlRef, name, ico, 0 AS lv
FROM places
WHERE LENGTH(:placeLike) > 3 AND name REGEXP :placeLike 

OTHER TIPS

Is this what you want on that last union?

    ...
    UNION
    SELECT placeId, urlRef, name, ico, 0 AS lv
    FROM places
    WHERE length(name) > 3
    ...

But I am not really sure I understand what "placelike" is supposed to be. Is it a variable? Is it a standard regex? I don't get it. I understand it is a bind variable, but I can't tell what is supposed to be in it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top