2016-04-16 2 views

ответ

1

Вы можете использовать INSTR с противоположными аргументами, чем можно было бы сделать в большинстве случаев:

SELECT * 
FROM mytable 
WHERE INSTR('hello world', mycol) = 1 

Это будет возвращать записи, где Mycol имеет подстроку «привет мир», начиная с позиции 1. Таким образом, любой из следующий будет соответствовать:

ч
он
Хель
ад
привет
привет (с завершающими пробелами)
привет ж
привет горе
привет УНР
привет Worl
привет мир

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

SELECT * 
FROM mytable 
WHERE INSTR('hello world', mycol) = 1 
AND mycol like 'h%' 

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

Хель
helaaaaaaa
helaaaaaab
helaaaaaac
... (более 1000 записей, как, что, и, наконец :)
привет мир

.. тогда двигатель все равно будет сканировать все записи и получать только первое и последнее.

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

SELECT * 
FROM mytable 
WHERE mycol IN ('h', 'he', 'hel', 'hell', 'hello', 'hello ', 'hello w', 
       'hello wo', 'hello wor', 'hello worl', 'hello world') 

Это будет иметь потенциально лучшую производительность.Если это не сделать, то, конечно, это сложный SQL сделает это:

SELECT * FROM mytable WHERE mycol = 'h' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'he' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hel' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hell' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello ' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello w' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello wo' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello wor' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello worl' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello world' 
+0

Будет ли индекс будет использоваться здесь, если используется '= 1'? – hansmaad

+0

Вы можете проверить с помощью 'EXPLAIN PLAN' на вашем экземпляре. Если нет, вы можете добавить 'AND mycol like 'h%'', что является избыточным, но может помочь движку обнаружить преимущество использования индекса. – trincot

+0

Хорошая идея, я думаю о минимальной длине, так что я мог бы использовать дополнительный «hel%» – hansmaad

0

Вы хотите использовать like для этого:

where col like 'hello%' -- or whatever 

или

where col like concat(@s, '%') 

Причина использование like состоит в том, что он может использовать индекс, потому что шаблон не начинается с подстановочных знаков.

EDIT:

я мог бы иметь логику в обратном направлении. Если да, то вы можете использовать как:

where @s like concat(col, '%') 

В этом случае, однако, индекс не может быть использован, так как столбец является аргументом функции.

+0

Я попробую, но я боюсь, что это слишком медленно, если индекс не может быть использован. – hansmaad

0

Вы можете использовать «как» в sql.

выберите * из TABLENAME где ColumnName как 'ч' %

Смежные вопросы