Поиск точного значения в MySQL

Я пытаюсь решить проблему, как найти точное значение из строки.

Поиск точного значения в MySQL

Затем проблема заключается в поиске в столбце StringB значения 1, он находит все строки, содержащие 1. Идея состоит в том, что если я ищу значение 1 в StringB, оно должно найти только точное значение.

Использование LIKE - не идеальный вариант, поскольку он возьмет все строки, содержащие 1, использование = также не вариант, поскольку он ищет равные значения. Также пробовал использовать INSTR, но работает почти так же, как LIKE. То же и с Locate.

На данный момент хранятся форматы:

  • число (пример: «2» без «»)
  • номер. (пример: «2.» без «»)
  • число.число (пример: "2.23.52.12.35" без "")

И они не меняются.

В этом столбце хранятся только числа, без букв или другого типа строки, ТОЛЬКО числа (целочисленный тип)

Есть ли способ строго искать ценность?

Моя база данных - InnoDB. Спасибо за ваше время.

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

ADyson 01.05.2018 13:06

регулярное выражение может вам помочь в строках ^ 2 [\\.] ??

SMA 01.05.2018 13:08

Я имею в виду, что нет типа float или double, такого как 2,5, 2,5 означает 2 и 5, и если я ищу номер 5, он должен считаться найденным, или если я ищу 2, он также считается.

JonZ 01.05.2018 13:14

Что такое 2.23.52.12.35? Конечно, это не число. Ваш вопрос подразумевает, что вы храните числа в виде текста. Разве это не так?

Tim Biegeleisen 01.05.2018 13:15

Да, его массив php используется с implode.

JonZ 01.05.2018 13:19

Вы пробовали что-то вроде LIKE '1%'

DEarTh 01.05.2018 13:20

Это было бы идеальным решением для меня, но число, которое я ищу, может быть в средней строке, начале или конце строки, И он ищет похожие значения, НЕ точные.

JonZ 01.05.2018 13:21

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

ADyson 01.05.2018 13:32

Логичный вопрос, зачем делать два запроса вместо одного? : D

JonZ 01.05.2018 13:42

@JonZ ты со мной разговариваешь? Если да, то отметьте меня знаком @, я видел это случайно. Кто что сказал про два запроса? Если бы у вас были две описанные мною таблицы, вы бы связали их вместе в один запрос Select через соединение.

ADyson 01.05.2018 15:32
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
10
618
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы это сделаете:

where stringB = 1

Затем MySQL должен выяснить, какие типы использовать. По правилам SQL он преобразует '1.00' в число - и они совпадают.

Если вы это сделаете

where stringB = '1'

Затем типы делают то, что вы задумали. И значения сравниваются как строки.

Подробнее: сохраняйте согласованность типов. Никогда не полагайтесь на неявное преобразование.

но что, если у меня есть 1.10.12.13 и я ищу 2, он будет считаться найденным или нет?

JonZ 01.05.2018 13:12
2 никогда не будет соответствовать '1.10.12.13', независимо от типа.
Gordon Linoff 01.05.2018 13:20

При использовании = он считается не найденным, если при использовании LIKE он найдет.

JonZ 01.05.2018 13:24

@GordonLinoff Он пытается найти точные целые числа в строке, разделенной точками.

Tim Biegeleisen 01.05.2018 13:27

@TimBiegeleisen. . . Я впечатлен вашим пониманием.

Gordon Linoff 01.05.2018 13:31
Ответ принят как подходящий

Попробуйте использовать REGEXP:

SELECT *
FROM yourTable
WHERE CONCAT('.', StringB, '.') REGEXP CONCAT('[.]', '2', '[.]');

Демо

Мы также могли бы использовать LIKE вместо REGEXP:

SELECT *
FROM yourTable
WHERE CONCAT('.', StringB, '.') LIKE CONCAT('%.', '2', '.%');

Никакие числа не являются целочисленными, что означает, что если у меня 1.10.11.12.13 и ищу 12, он должен считаться найденным, но если я ищу 2, эта строка не найдена. не имеет значения, есть ли у него 12 я ищу точные 2.

JonZ 01.05.2018 13:18

Работаю как профессионал @TimBiegeleisen, большое спасибо

JonZ 01.05.2018 13:28

@JitendraSoftgrid Возможно, мы могли бы использовать здесь LIKE, но в первую очередь мне пришло в голову регулярное выражение.

Tim Biegeleisen 01.05.2018 13:28

Хороший вопрос, я не знаю ответа; вы можете попробовать оба. Я мощь ожидаю, что LIKE превзойдет REGEXP, поскольку вызов механизма регулярных выражений всегда имеет накладные расходы. Попробуйте оба варианта и выберите лучший вариант.

Tim Biegeleisen 01.05.2018 13:47

Другие вопросы по теме