Как найти часть слова в поиске

eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

1

Запрос на поиск по части слова

02.03.2020, 09:48. Показов 16680. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день!
Подскажите как правильно сделать запрос по части слова?
Запрос на поиск всего слова:

Python
1
cursor.execute(select * from BUSINESS.V_PLATFORM_DDA where NAME = :jobno, {"jobno" : str(num)})

Пробую так но не получается:

Python
1
2
3
4
cursor.execute("""select * 
                   from BUSINESS.V_PLATFORM_DDA 
                   where NAME like '%'+:jobno+'%'""", 
                   {"jobno" : str(num)})



1



Grossmeister

Модератор

4202 / 3042 / 581

Регистрация: 21.01.2011

Сообщений: 13,168

02.03.2020, 10:05

2

Цитата
Сообщение от eagl69
Посмотреть сообщение

Пробую так но не получается

Поиск по части слова

SQL
1
WHERE fld1 LIKE '%abc%'

А если что не так с кодом на Python – так это в другой форум



1



eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

02.03.2020, 10:41

 [ТС]

3

Да в ветке БД питон пусто
вот нашел решение, может кому пригодится.

Python
1
where NAME LIKE '%' || :jobno || '%'



1



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

03.03.2020, 14:48

4

Всегда делал так:

Python
1
2
3
4
5
6
query = """
    select * 
      from BUSINESS.V_PLATFORM_DDA 
     where NAME like '%{jobno}%'
    """.format(jobno=str(num))
cursor.execute(query)

Считал это единственным правильным вариантом и только что узнал, что можно делать как-то иначе.



0



10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 12:41

 [ТС]

5

Добрый день!

В принципе оба способа работают, но столкнулся вот с такой проблемой, ищу по части слова которая выглядит так: “_55_” не воспринимаются нижние подчеркивания как часть слова, например из дух ячеек “Д_77_5511” и “Д_55_0911” должно вывестись только “Д_55_0911”, а показывает все…. В чем может быть причина?

И второй вопрос, можно ли отправить еще и имя таблицы? where NAME(где NAME это переменная)



0



Модератор

4202 / 3042 / 581

Регистрация: 21.01.2011

Сообщений: 13,168

18.03.2020, 13:22

6

Цитата
Сообщение от eagl69
Посмотреть сообщение

В чем может быть причина?

Потому что нижнее подчеркивание в LIKE – это шаблонный символ. % означает любой кол. любых символов, а _ – любой один символ.

Цитата
Сообщение от eagl69
Посмотреть сообщение

where NAME(где NAME это переменная)

SQL для этого не предназначен. Есть динамический SQL, но как он сочетается с Pytnon (если у тебя вопрос по нему) – это нужно в их форум.



0



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

18.03.2020, 14:28

7

Цитата
Сообщение от eagl69
Посмотреть сообщение

ищу по части слова которая выглядит так: “_55_” не воспринимаются нижние подчеркивания как часть слова, например из дух ячеек “Д_77_5511” и “Д_55_0911” должно вывестись только “Д_55_0911”, а показывает все…

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

SQL
1
WHERE NAME LIKE '%!_55!_%'  ESCAPE '!'

Или можно делать замену заранее:

SQL
1
WHERE REPLACE(NAME, '_', '!') LIKE '%!55!%'

Цитата
Сообщение от eagl69
Посмотреть сообщение

И второй вопрос, можно ли отправить еще и имя таблицы? where NAME(где NAME это переменная)

Можно.

Python
1
2
3
4
5
6
7
column_name = "NAME"
query = """
    select * 
      from BUSINESS.V_PLATFORM_DDA 
     where {colname} like '%{jobno}%'
    """.format(jobno=str(num), colname=column_name)
cursor.execute(query)



0



eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 15:29

 [ТС]

8

Цитата
Сообщение от Jefe
Посмотреть сообщение

Можно.

Извиняюсь, ошибся надо передать не имя столбца а имя таблицы

Python
1
2
3
4
5
table = BUSINESS.V_PLATFORM_DDA
"""select * 
    from {tabl1} # так можно?
    where Name like '%{jobno}%'""",
    format(jobno=str(num), tabl1=table)

С подчеркиваниями понял, спасибо.



0



311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

18.03.2020, 16:08

9

Цитата
Сообщение от eagl69
Посмотреть сообщение

from {tabl1} # так можно?

Да, можно. Только в 1й строке в кавычки взять название таблицы, строка как никак.



0



eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 18:56

 [ТС]

10

Цитата
Сообщение от Jefe
Посмотреть сообщение

Да, можно. Только в 1й строке в кавычки взять название таблицы, строка как никак.

Да, спасибо, забыл написать, ну и еще один вопрос, как сделать поиск без учета регистра?
такой способ не работает:

Python
1
2
3
4
5
table = 'BUSINESS.V_PLATFORM_DDA'
"""select * 
    from {tabl1} # так можно?
    where Name like LOWER('%{jobno}%')""",
    format(jobno=str(num), tabl1=table)



0



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

18.03.2020, 19:34

11

Цитата
Сообщение от eagl69
Посмотреть сообщение

like LOWER(‘%{jobno}%’)

Со стороны Оракла lower добавали, это ок.
Ещё нужно добавить со стороны питона:

Python
1
jobno=str(num).lower()

Добавлено через 3 минуты
Ой, чуть не так:

Python
1
2
3
4
5
table = 'BUSINESS.V_PLATFORM_DDA'
"""select * 
    from {tabl1} # так можно?
    where LOWER(Name) like '%{jobno}%'""",
    format(jobno=str(num).lower(), tabl1=table)



1



10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 21:58

 [ТС]

12

Да, спасибо сработало. но вот во второй базе на SQLite не идет.



0



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

19.03.2020, 12:21

13

Лучший ответ Сообщение было отмечено eagl69 как решение

Решение

А с чего бы ему идти и в SQLite?
Там свой синтаксис.
там вот так _55_ должно экранироваться знаком

Python
1
where lower(Name) like '%_{jobno}_%'

, где {jobno} это 55



1



При работе с базой данных SQL вам может понадобиться найти записи, содержащие определенные строки. В этой статье мы разберем, как искать строки и подстроки в MySQL и SQL Server.

Содержание

  • Использование операторов WHERE и LIKE для поиска подстроки
  • Поиск подстроки в SQL Server с помощью функции CHARINDEX
  • Поиск подстроки в SQL Server с помощью функции PATINDEX
  • MySQL-запрос для поиска подстроки с применением функции SUBSTRING_INDEX()

Я буду использовать таблицу products_data в базе данных products_schema. Выполнение команды SELECT * FROM products_data покажет мне все записи в таблице:

Поскольку я также буду показывать поиск подстроки в SQL Server, у меня есть таблица products_data в базе данных products:

Поиск подстроки при помощи операторов WHERE и LIKE

Оператор WHERE позволяет получить только те записи, которые удовлетворяют определенному условию. А оператор LIKE позволяет найти определенный шаблон в столбце. Эти два оператора можно комбинировать для поиска строки или подстроки.

Например, объединив WHERE с LIKE, я смог получить все товары, в которых есть слово «computer»:

SELECT * FROM products_data
WHERE product_name LIKE '%computer%'

Знаки процента слева и справа от «computer» указывают искать слово «computer» в конце, середине или начале строки.

Если поставить знак процента в начале подстроки, по которой вы ищете, это будет указанием найти такую подстроку, стоящую в конце строки. Например, выполнив следующий запрос, я получил все продукты, которые заканчиваются на «er»:

SELECT * FROM products_data
WHERE product_name LIKE '%er'

А если написать знак процента после искомой подстроки, это будет означать, что нужно найти такую подстроку, стоящую в начале строки. Например, я смог получить продукт, начинающийся на «lap», выполнив следующий запрос:

SELECT * FROM products_data
WHERE product_name LIKE 'lap%'

Этот метод также отлично работает в SQL Server:

Поиск подстроки в SQL Server с помощью функции CHARINDEX

CHARINDEX() — это функция SQL Server для поиска индекса подстроки в строке.

Функция CHARINDEX() принимает 3 аргумента: подстроку, строку и стартовую позицию для поиска. Синтаксис выглядит следующим образом:

CHARINDEX(substring, string, start_position)

Если функция находит совпадение, она возвращает индекс, по которому найдено совпадение, а если совпадение не найдено, возвращает 0. В отличие от многих других языков, отсчет в SQL начинается с единицы.

Пример:

SELECT CHARINDEX('free', 'free is the watchword of freeCodeCamp') position;

Как видите, слово «free» было найдено на позиции 1. Это потому, что на позиции 1 стоит его первая буква — «f»:

Можно задать поиск с конкретной позиции. Например, если указать в качестве позиции 25, SQL Server найдет совпадение, начиная с текста «freeCodeCamp»:

SELECT CHARINDEX('free', 'free is the watchword of freeCodeCamp', 25);

При помощи CHARINDEX можно найти все продукты, в которых есть слово «computer», выполнив этот запрос:

SELECT * FROM products_data WHERE CHARINDEX('computer', product_name, 0) > 0

Этот запрос диктует следующее: «Начиная с индекса 0 и до тех пор, пока их больше 0, ищи все продукты, названия которых содержат слово «computer», в столбце product_name». Вот результат:

Поиск подстроки в SQL Server с помощью функции PATINDEX

PATINDEX означает «pattern index», т. е. «индекс шаблона». Эта функция позволяет искать подстроку с помощью регулярных выражений.

PATINDEX принимает два аргумента: шаблон и строку. Синтаксис выглядит следующим образом:

PATINDEX(pattern, string)

Если PATINDEX находит совпадение, он возвращает позицию этого совпадения. Если совпадение не найдено, возвращается 0. Вот пример:

SELECT PATINDEX('%ava%', 'JavaScript is a Jack of all trades');

Чтобы применить PATINDEX к таблице, я выполнил следующий запрос:

SELECT product_name, PATINDEX('%ann%', product_name) position
FROM products_data

Но он только перечислил все товары и вернул индекс, под которым нашел совпадение:

Как видите, подстрока «ann» нашлась под индексом 3 продукта Scanner. Но скорее всего вы захотите, чтобы выводился только тот товар, в котором было найдено совпадение с шаблоном.

Чтобы обеспечить такое поведение, можно использовать операторы WHERE и LIKE:

SELECT product_name, PATINDEX('%ann%', product_name) position
FROM products_data
WHERE product_name LIKE '%ann%'

Теперь запрос возвращает то, что нужно.

MySQL-запрос для поиска строки с применением функции SUBSTRING_INDEX()

Помимо решений, которые я уже показал, MySQL имеет встроенную функцию SUBSTRING_INDEX(), с помощью которой можно найти часть строки.

Функция SUBSTRING_INDEX() принимает 3 обязательных аргумента: строку, разделитель и число. Числом обозначается количество вхождений разделителя.

Если вы укажете обязательные аргументы, функция SUBSTRING_INDEX() вернет подстроку до n-го разделителя, где n — указанное число вхождений разделителя. Вот пример:

SELECT SUBSTRING_INDEX("Learn on freeCodeCamp with me", "with", 1);

В этом запросе «Learn on freeCodeCamp with me» — это строка, «with» — разделитель, а 1 — количество вхождений разделителя. В этом случае запрос выдаст вам «Learn on freeCodeCamp»:

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

SELECT SUBSTRING_INDEX("Learn on freeCodeCamp with me", "with", -1);

От редакции Techrocks: также предлагаем почитать «Индексы и оптимизация MySQL-запросов».

Заключение

Из этой статьи вы узнали, как найти подстроку в строке в SQL, используя MySQL и SQL Server.

CHARINDEX() и PATINDEX() — это функции, с помощью которых можно найти подстроку в строке в SQL Server. Функция PATINDEX() является более мощной, так как позволяет использовать регулярные выражения.

Поскольку в MySQL нет CHARINDEX() и PATINDEX(), в первом примере мы рассмотрели, как найти подстроку в строке с помощью операторов WHERE и LIKE.

Перевод статьи «SQL Where Contains String – Substring Query Example».

<?php include_once('db.php');
$query = ('SELECT * FROM carsekb WHERE car_name = :car ORDER BY car_name ASC');
$stmt = $pdo->prepare($query);
$stmt->execute(['car' => $_POST['carname']]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<table>";
for ($i = 0; $i < count($results); $i++) { ?>
    <tr>
        <td><?= $results[$i]['car_name']; ?></td>
        <td><?= $results[$i]['uberstart']; ?></td>
        <td><?= $results[$i]['uberx']; ?></td>
    </tr>
<?php } 
echo "</table>"; ?>

Использую PDO. В данном примере поиск стоит по равному значению car_name = :car. Есть ли какой-то способ просто искать по части слова, к примеру, набираю volksw и жму поиск – вылазит volkswagen passat, volkawagen jetta и тд все что содержит volksw, и точно также если ищу volkswagen pas – вылезало volkswagen passat?

задан 2 окт 2017 в 6:13

Paul Wall's user avatar

Paul WallPaul Wall

1,7231 золотой знак12 серебряных знаков31 бронзовый знак

0

Поиск нужно делать по LIKE, а не по =

Что-то вроде такого:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('%value%'));

ответ дан 2 окт 2017 в 6:28

DaemonHK's user avatar

DaemonHKDaemonHK

2,2841 золотой знак15 серебряных знаков29 бронзовых знаков

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

USE ИМЯ_БД
SELECT * FROM `ТАБЛИЦА`
WHERE ИМЯ_ПОЛЯ LIKE 'ЧТО ИЩЕМ%'

Знак процента обязателен! Он как раз указывает на то что мы ищем только по первой части выражения.

ответ дан 2 окт 2017 в 6:30

Работая с текстом, особенно с большими объемами, зачастую необходимо найти слово или кусок текста. Для этого можно воспользоваться поиском по тексту в Ворде. Существует несколько вариантов поиска в Word:

  • Простой поиска, через кнопку «Найти» (открывается панель Навигация);
  • Расширенный поиск, через кнопку «Заменить», там есть вкладка «Найти».

Самый простой поиск в ворде – это через кнопку «Найти». Эта кнопка расположена во вкладке «Главная» в самом правом углу.

поиск по тексту в ворде

! Для ускорения работы, для поиска в Ворде воспользуйтесь комбинацией клавишей: CRL+F

После нажатия кнопки или сочетания клавишей откроется окно Навигации, где можно будет вводить слова для поиска.

поиск в ворде

! Это самый простой и быстрый способ поиска по документу Word.

Для обычного пользователя большего и не нужно. Но если ваша деятельность, вынуждает Вас искать более сложные фрагменты текста (например, нужно найти текст с синим цветом), то необходимо воспользоваться расширенной формой поиска.

Расширенный поиск в Ворде

Часто возникает необходимость поиска слов в Ворде, которое отличается по формату. Например, все слова, выделенные жирным. В этом как рас и поможет расширенный поиск.

Существует 3 варианта вызова расширенного поиска:

  • В панели навигация, после обычного поиска

поиск слов в ворде

  • На кнопке «Найти» нужно нажать на стрелочку вниз

как найти слово в тексте word

  • Нужно нажать на кнопку «Заменить» , там выйдет диалоговое окно. В окне перейти на вкладку «Найти»

как найти в ворде слово в тексте

В любом случае все 3 варианта ведут к одной форме – «Расширенному поиску».

Как в Word найти слово в тексте – Расширенный поиск

После открытия отдельного диалогового окна, нужно нажать на кнопку «Больше»

поиск по документу word

После нажатия кнопки диалоговое окно увеличится

как найти в ворде нужное слово

Перед нами высветилось большое количество настроек. Рассмотрим самые важные:

Направление поиска

В настройках можно задать Направление поиска. Рекомендовано оставлять пункт «Везде». Так найти слово в тексте будет более реально, потому что поиск пройдет по всему файлу. Еще существуют режимы «Назад» и «Вперед». В этом режиме поиск начинается от курсора и идет вперед по документу или назад (Вверх или вниз)

Направление поиска в Ворде

Поиск с учетом регистра

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

Поиск с учетом регистра

Поиск по целым словам

Если нажать на вторую галочку, «Только слово целиком», то поиск будет искать не по символам, а по целым словам. Т.е. если вбить в поиск только часть слова, то он его не найдет. Напимер, необходимо найти слово Ворд, при обычном поиске будут найдены все слова с разными окончаниями (Ворде, Ворду), но при нажатой галочке «Только слова целиком» этого не произойдет.

Поиск целых слов

Подстановочные знаки

Более тяжелый элемент, это подстановочные знаки. Например, нам нужно найти все слова, которые начинаются с буквы м и заканчиваются буквой к. Для этого в диалоговом окне поиска нажимаем галочку «Подстановочные знаки», и нажимаем на кнопку «Специальный», в открывающемся списке выбираем нужный знак:

Подстановочные знаки

В результате Word найдет вот такое значение:

поиск с подстановочными знаками

Поиск омофонов

Microsoft Word реализовал поиск омофонов, но только на английском языке, для этого необходимо выбрать пункт «Произносится как». Вообще, омофоны — это слова, которые произносятся одинаково, но пишутся и имеют значение разное. Для такого поиска необходимо нажать «Произносится как». Например, английское слово cell (клетка) произносится так же, как слово sell (продавать).

Поиск омофонов

! из-за не поддержания русского языка, эффективность от данной опции на нуле

Поиск по тексту без учета знаков препинания

Очень полезная опция «Не учитывать знаки препинания». Она позволяет проводить поиск без учета знаков препинания, особенно хорошо, когда нужно найти словосочетание в тексте.

Поиск по тексту без учета знаков препинания

Поиск слов без учета пробелов

Включенная галочка «Не учитывать пробелы» позволяет находить словосочетания, в которых есть пробел, но алгоритм поиска Word как бы проглатывает его.

Поиск слов без учета пробелов

Поиск текста по формату

Очень удобный функционал, когда нужно найти текст с определенным форматированием. Для поиска необходимо нажать кнопку Формат, потом у Вас откроется большой выбор форматов:

Поиск текста по формату

Для примера в тексте я выделил Жирным текст «как найти слово в тексте Word». Весть текст выделен полужирным, а кусок текста «слово в тексте Word» сделал подчернутым.

В формате я выбрал полужирный, подчеркивание, и русский язык. В итоге Ворд наше только фрагмент «слово в тексте». Только он был и жирным и подчеркнутым и на русском языке.

Поиск текста по формату

После проделанных манипуляция не забудьте нажать кнопку «Снять форматирование». Кнопка находится правее от кнопки «Формат».

Специальный поиск от Ворд

Правее от кнопки формат есть кнопка «Специальный». Там существует огромное количество элементов для поиска

Специальный поиск от Ворд

Через этот элемент можно искать:

  • Только цифры;
  • Графические элементы;
  • Неразрывные пробелы или дефисы;
  • Длинное и короткое тире;
  • Разрывы разделов, страниц, строк;
  • Пустое пространство (особенно важно при написании курсовых и дипломных работ);
  • И много других элементов.

Опции, которые не приносят пользы

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

  • Опция «произносится как». Не поддержание русского языка, делает эту опцию бессмысленной;
  • Опция «все словоформы», опция полезная при замене. А если нужно только найти словоформы, то с этим справляется обычный поиск по тексту;
  • Опция «Учитывать префикс» и «Учитывать суффикс» – поиск слов, с определенными суффиксами и префиксами. Этот пункт так же полезен будет при замене текста, но не при поиске. С этой функцией справляется обычный поиск.

Прочитайте
ru.wikipedia.org/wiki/ВП: Поиск
и расширенная система поиска (в т. ч. можно выбрать через какой поисковик и где искать) : http://ru.wikipedia.org/wiki/Служебная: Search

Есть ещё такое:
http://ru.wikipedia.org/wiki/Служебная: PrefixIndex

Обратите внимание, что в Википедии при введении части слова, появляется ниспадающее меню, которое предлагает варианты.
Если Вы не знаете как пишется “молоко”, то можете ввести “мол” и увидите вариант “молоко”.

Можно воспользоваться системой поиска по категориям:
ru.wikipedia.org/wiki/Википедия: Поиск_по_категориям

Или алфавитным указателем (хотя пользуются им крайне редко) :
ru.wikipedia.org/wiki/Википедия: Алфавитный_указатель

Если Вам нужно произвести какую-то специфическую выборку статей из категорий, то воспользуйтесь инструментом на тулсервере:
http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php

или новой версией http://toolserver.org/~magnus/catscan_rewrite.php (для русского раздела не работает) .
Посмотрите какие ещё инструмены создал этот участник:
http://toolserver.org/~magnus/ (там есть кое-что интересное: поиск своодных изображений, поиск неотпатрулированных статей и тп.)

Добавить комментарий