Числовая последовательность в MySQL
В Python, если бы я хотел последовательность от 0 до 9 (включительно), я бы использовал xrange(0,10) . Есть ли способ, которым я могу сделать это в MySQL?
4 ответа
Так как xrange не существует, можно использовать отдельную таблицу, сохраненную с целым числом (как было сказано ранее), или просто создать хранимую процедуру для выполнения работы:
DROP PROCEDURE IF EXISTS xrange;
DELIMITER //
CREATE PROCEDURE xrange(x INT, y INT)
BEGIN
DECLARE i INT DEFAULT x;
CREATE TEMPORARY TABLE xrange_tmp (c1 INT);
WHILE i < y DO
INSERT INTO xrange_tmp VALUES (i);
SET i = i + 1;
END WHILE;
END;
//
Использование:
CALL xrange(-2,10);
SELECT c1 FROM xrange_tmp;
DROP TABLE xrange_tmp;
Выше, очевидно, будет медленнее, чем создание готовой таблицы с целыми числами. Это более гибкий, хотя.
Если Python является вашим языком программирования, вы можете отобразить тот же диапазон Python, чтобы создать оператор INSERT в форме:
INSERT INTO Table (IDCol) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)
Не совсем то, что вы просили, но одна строка кода Python, которая будет обрабатывать любой диапазон вплоть до максимальной длины оператора MySQL.
Вы можете использовать LAST_INSERT_ID() для имитации последовательностей в MySQL.
Если expr задан в качестве аргумента для LAST_INSERT_ID(), значение аргумента возвращается функцией и запоминается как следующее значение, которое будет возвращено LAST_INSERT_ID(). Это может быть использовано для симуляции последовательностей:
Создайте таблицу для хранения счетчика последовательности и инициализируйте его:
CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);
Используйте таблицу для генерации порядковых номеров следующим образом:
UPDATE sequence SET id=LAST_INSERT_ID(id+1);
SELECT LAST_INSERT_ID();
Оператор UPDATE увеличивает счетчик последовательности и вызывает
следующий вызов LAST_INSERT_ID() для возврата обновленного значения. Оператор SELECT извлекает это значение. API-функция mysql_insert_id() C также может быть использована для получения значения. См. Раздел 21.9.3.37, "mysql_insert_id ()".
Читайте больше здесь, а также некоторые обсуждения этого здесь
Попробуйте вариант таблицы целых чисел. Этот взят из Xaprb:
create table integers(i int unsigned not null);
insert into integers(i) values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
select (hundreds.i * 100) + (tens.i * 10) + units.i as iii
from integers as units
cross join integers as tens
cross join integers as hundreds;
Если вы сделали это в прошлом select
вид, названный, скажем, xrange999
тогда вы можете просто:
SELECT iii FROM xrange999 WHERE iii BETWEEN 0 AND 9
(конечно, вы можете сделать это только с десятью рядами integers
таблица, но я считаю тысячу целых чисел немного более полезным.)