Я пытаюсь решить проблему, как найти точное значение из строки.
Затем проблема заключается в поиске в столбце StringB
значения 1
, он находит все строки, содержащие 1
. Идея состоит в том, что если я ищу значение 1
в StringB
, оно должно найти только точное значение.
Использование LIKE
- не идеальный вариант, поскольку он возьмет все строки, содержащие 1
, использование =
также не вариант, поскольку он ищет равные значения.
Также пробовал использовать INSTR
, но работает почти так же, как LIKE
.
То же и с Locate
.
На данный момент хранятся форматы:
И они не меняются.
В этом столбце хранятся только числа, без букв или другого типа строки, ТОЛЬКО числа (целочисленный тип)
Есть ли способ строго искать ценность?
Моя база данных - InnoDB. Спасибо за ваше время.
регулярное выражение может вам помочь в строках ^ 2 [\\.] ??
Я имею в виду, что нет типа float или double, такого как 2,5, 2,5 означает 2 и 5, и если я ищу номер 5, он должен считаться найденным, или если я ищу 2, он также считается.
Что такое 2.23.52.12.35
? Конечно, это не число. Ваш вопрос подразумевает, что вы храните числа в виде текста. Разве это не так?
Да, его массив php используется с implode.
Вы пробовали что-то вроде LIKE '1%'
Это было бы идеальным решением для меня, но число, которое я ищу, может быть в средней строке, начале или конце строки, И он ищет похожие значения, НЕ точные.
«Да, его массив php используется с implode» ... Понятно. Если бы ваша база данных была правильно нормализована, вы бы действительно не хранили несколько значений в одном поле и не имели бы такой проблемы. Вероятно, это требует дочерней таблицы с внешним ключом. Тогда запрос на поиск нужного значения будет тривиальным.
Логичный вопрос, зачем делать два запроса вместо одного? : D
@JonZ ты со мной разговариваешь? Если да, то отметьте меня знаком @, я видел это случайно. Кто что сказал про два запроса? Если бы у вас были две описанные мною таблицы, вы бы связали их вместе в один запрос Select через соединение.
Если вы это сделаете:
where stringB = 1
Затем MySQL должен выяснить, какие типы использовать. По правилам SQL он преобразует '1.00'
в число - и они совпадают.
Если вы это сделаете
where stringB = '1'
Затем типы делают то, что вы задумали. И значения сравниваются как строки.
Подробнее: сохраняйте согласованность типов. Никогда не полагайтесь на неявное преобразование.
но что, если у меня есть 1.10.12.13 и я ищу 2, он будет считаться найденным или нет?
2
никогда не будет соответствовать '1.10.12.13'
, независимо от типа.
При использовании = он считается не найденным, если при использовании LIKE он найдет.
@GordonLinoff Он пытается найти точные целые числа в строке, разделенной точками.
@TimBiegeleisen. . . Я впечатлен вашим пониманием.
Попробуйте использовать 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.
Работаю как профессионал @TimBiegeleisen, большое спасибо
@JitendraSoftgrid Возможно, мы могли бы использовать здесь LIKE
, но в первую очередь мне пришло в голову регулярное выражение.
Хороший вопрос, я не знаю ответа; вы можете попробовать оба. Я мощь ожидаю, что LIKE
превзойдет REGEXP
, поскольку вызов механизма регулярных выражений всегда имеет накладные расходы. Попробуйте оба варианта и выберите лучший вариант.
вы описываете все сохраненные «форматы», которые на самом деле представляют собой просто все строки, но затем говорите, что столбец является столбцом типа «int». Эти два утверждения противоречат друг другу. Не могли бы вы уточнить?