2017-02-06 3 views
1

Я использую sparq sql. Скажем, это снимок моего большого стола:Как запросить текст, чтобы найти самые длинные строки префикса в SQL?

ups store 
ups store austin 
ups store chicago 
ups store bern 
walmart 
target 

Как я могу найти самый длинный префикс для приведенных выше данных в SQL Server? То есть:

ups store 
walmart 
target 

У меня уже есть программа Java, чтобы сделать это, но у меня есть большой файл, теперь мой вопрос , если это может быть разумно сделано в SQL?

Как насчет следующего более сложного scnenario? (Я могу жить без этого, но приятно иметь, если это возможно)

ups store austin 
ups store chicago 
ups store bern 
walmart 
target 

и что бы вернуть [ups store, walmart, target].

+0

префиксом - глядя на ваши примеры - вы имеете в виду длинную строку до последнего пробела между словами ? – marcothesane

+0

Да, это правильно – user1848018

+0

Почему вы отмечаете mysqli и postgresql. Если вы ищете ответ SQL, то этого тега достаточно. – Sebas

ответ

1

Предполагая, что вы можете создать еще одну таблицу, которая просто имеет список восходящих целые числа от нуля до величины максимально возможной строки, то следующий должен делать эту работу, используя только ANSI SQL:

SELECT 
    id, 
    SUBSTRING(name, 1, CASE WHEN number = 0 THEN LENGTH(name) ELSE number END) AS prefix 
FROM 
-- Join all places to all possible substring lengths. 
(SELECT * 
    FROM places p 
    CROSS JOIN lengths l) subq 
-- If number is zero then no prefix match was found elsewhere 
-- (from the question it looked like you wanted to include these) 
WHERE (subq.number = 0 OR 
     -- Look for prefix match elsewhere 
     EXISTS (SELECT * FROM places p 
       WHERE SUBSTRING(p.name FROM 1 FOR subq.number) 
        = SUBSTRING(subq.name FROM 1 FOR subq.number) 
       AND p.id <> subq.id)) 
    -- Include as a prefix match if the whole string is being used 
    AND (subq.number = LENGTH(name) 
     -- Don't include trailing spaces in a prefix 
     OR (SUBSTRING(subq.name, subq.number, 1) <> ' ' 
      -- Only include the longest prefix match 
      AND NOT EXISTS (SELECT * FROM places p 
          WHERE SUBSTRING(p.name FROM 1 FOR subq.number + 1) 
           = SUBSTRING(subq.name FROM 1 FOR subq.number + 1) 
          AND p.id <> subq.id))) 
ORDER BY id; 

Live Demo:http://rextester.com/XPNRP24390

во второй Аспект заключается в том, что если у нас (ups store austin, ups store chicago). мы можем использовать SQL для извлечения «ups store».

Это должно быть просто случай использования SUBSTRING аналогичным образом к вышесказанному, например:

SELECT SUBSTRING(name, 
       LENGTH('ups store ') + 1, 
       LENGTH(name) - LENGTH('ups store ')) 
FROM places 
WHERE SUBSTRING(name, 
       1, 
       LENGTH('ups store ')) = 'ups store '; 
+0

Спасибо, не имеем доступа к системе. проверит его очень скоро – user1848018

+0

Пробовал ваш код, на искру SQL, возвратил только «ups store», не перечислил [target, walmart], но когда я запустил его на вашем онлайн-сайте, он вернул [цель, walmart]. Это не большая проблема, хотя я был просто удивлен – user1848018

+0

Хммм, странно, эти значения должны быть возвращены из условия 'subq.number = 0 OR ...', так как в этом случае префикс не найден нигде. –

0

Предположив ваше имя столбца является «MyColumn», и ваш большой стол «туЬаЫе», и единое пространство Ваш разделитель полей:

В PostgreSQL, вы могли бы сделать что-то же просто, как это:

select 
    mycolumn 
from 
    mytable 
order by 
    length(split_part(mycolumn, ' ', 1)) desc 
limit 
    1 

Если вы запускали этот запрос часто, я бы, наверное, попробовать упорядоченный функциональный индекс таблицы, как это:

create prefix_index on mytable (length(split_part(mycolumn, ' ', 1)) desc) 
Смежные вопросы