is ничего не готово, что работает так.
Вы можете написать пользовательскую функцию или loadable UDF, но это была бы значительная работа, оказывающая значительное влияние на базу данных. Затем вы можете запустить WHERE GET_BID_ID(comment) < 4000
.
Что вы можете сделать более легко это придумать какой-то способ извлечения bid_id
с помощью available string functions.
Например, если bid_id
всегда находится в последних десяти символах, вы можете извлечь их и заменить все символы, которые не являются цифрами, нолями. Осталось bid_id
и , которое вы можете сравнить.
Конечно, вам нужно сложное выражение с LENGTH()
, SUBSTRING()
и REPLACE()
. Если bid_id находится между легко узнаваемыми разделителями, то, возможно, SUBSTRING_INDEX()
- больше ваш друг.
Но лучше еще ... добавьте столбец INTEGER, инициализируйте его нулевым, , затем сохраните там извлеченный bid_id
. Или ноль, если вы уверены, что нет bid_id
. Наличие данных, хранящихся в смешанных контекстах, является злым (и известным антипаттерном SQL для загрузки). Как только у вас будет доступный столбец, вы можете выбрать каждые несколько секунд небольшое количество элементов с new_bid_id
еще NULL и подвергнуть их извлечению, тем самым постепенно изменяя базу данных без перегрузки системы.
На практике
Это тот же подход можно было бы использовать более сложные случаи. Мы начинаем проверки то, что у нас есть (это тест стол)
SELECT commento FROM arti LIMIT 3;
+-----------------------------------------+
| commento |
+-----------------------------------------+
| This is the first comment 100 200 42500 |
| Another 7 Q 32768 |
| And yet another 200 15 55332 |
+-----------------------------------------+
Так что нам нужно последние символы:
SELECT SUBSTRING(commento, LENGTH(commento)-5) FROM arti LIMIT 3;
+-----------------------------------------+
| SUBSTRING(commento, LENGTH(commento)-5) |
+-----------------------------------------+
| 42500 |
| 32768 |
| 55332 |
+-----------------------------------------+
Это выглядит хорошо, но это не; перед идентификатором осталось дополнительное пространство. Так что 5 не работает, SUBSTRING - 1. Не важно; мы просто используем 4.
... и все готово.
mysql> SELECT commento FROM arti WHERE SUBSTRING(commento, LENGTH(commento)-4) < 40000;
+-------------------+
| commento |
+-------------------+
| Another 7 Q 32768 |
+-------------------+
mysql> SELECT commento FROM arti WHERE SUBSTRING(commento, LENGTH(commento)-4) BETWEEN 35000 AND 55000;
+-----------------------------------------+
| commento |
+-----------------------------------------+
| This is the first comment 100 200 42500 |
+-----------------------------------------+
Проблема в том, что у вас есть номер не такой же длины (например, 300 и 131072).Затем вам нужно взять кусочек, достаточно большой для большего числа, и если число будет коротким, вы получите, возможно, «1 5 300» в своем фрагменте. Вот где SUBSTRING_INDEX
приходит на помощь: захватив семь символов, от «131072» до «1 5 300», идентификатор всегда будет в последнем проемом, разделенном токеном фрагмента.
В ЭТОМ ПОСЛЕДНЕМ ДЕЛО, когда номера не имеют одинаковой длины, вы найдете проблему. Выделенные идентификаторы вовсе не являются номерами - для MySQL - строк. Это означает, что они сравниваются в лексикографическом, а не в численном порядке; и «17534» считается меньше, чем «202», так же, как «Алиса» приходит перед «Бобом». Чтобы преодолеть это, вам нужно указать строку как целое без знака, что еще больше замедлит работу.
WHERE CAST(SUBSTRING(...) AS UNSIGNED) < 4000
хорошо, что пора лишить этого числа в свою собственную колонку в настоящее время не так: р – Drew