Как создать число, кратное 3, в результирующем наборе в качестве вывода в mysql 5.X в sql - PullRequest
0 голосов
/ 10 июля 2020

В результирующем наборе я должен получить что-то вроде целого * на 3, до определенного предела, скажем, до 20, ie. до 20 * 3 = 60 In mysql 5.X, используя только Sql

col1
3
6
9
12
15
..
..
..
..

In oracle, мы можем легко сделать это, используя предложение level.

Ответы [ 3 ]

1 голос
/ 13 июля 2020

CONNECT BY LEVEL - это старый собственный синтаксис Oracle для рекурсивных запросов.

Стандарт SQL вместо этого использует рекурсивные CTE, поддерживаемые Oracle в версии 11.2 и MySQL как версии 8.

with recursive numbers(number) as
(
  select 3
  union all
  select number + 3 from numbers where number + 3 <= 20
)
select number
from numbers
order by number;

Демо: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b497c18f4632d4a7fe77a6a0027a08e6

1 голос
/ 10 июля 2020

В MySQL вы можете создать процедуру для сохранения результата во временной таблице и последующего отображения, примерно так:

DELIMITER $
CREATE PROCEDURE `temp`(upto integer)
BEGIN
    DROP TABLE IF EXISTS multiple;
    CREATE TABLE multiple(col1 integer);
    SET @i := 1;
    while @i <= upto DO
        set @val := 3 * @i;
        set @sql := CONCAT('INSERT INTO multiple values(',@val,')');
        prepare b from @sql;
        execute b;
        set @i := @i + 1;
    end while;

    select * from multiple;
end $

DELIMITER ;

call temp(20);
0 голосов
/ 10 июля 2020

Я нашел этот ответ из сообщения { ссылка } и изменил его в соответствии с этим требованием.

select SeqValue*3 from (SELECT
    (HUNDREDS.SeqValue + TENS.SeqValue + ONES.SeqValue) SeqValue
FROM
    (
    SELECT 0  SeqValue
    UNION ALL
    SELECT 1 SeqValue
    UNION ALL
    SELECT 2 SeqValue
    UNION ALL
    SELECT 3 SeqValue
    UNION ALL
    SELECT 4 SeqValue
    UNION ALL
    SELECT 5 SeqValue
    UNION ALL
    SELECT 6 SeqValue
    UNION ALL
    SELECT 7 SeqValue
    UNION ALL
    SELECT 8 SeqValue
    UNION ALL
    SELECT 9 SeqValue
    ) ONES
CROSS JOIN
    (
    SELECT 0 SeqValue
    UNION ALL
    SELECT 10 SeqValue
    UNION ALL
    SELECT 20 SeqValue
    UNION ALL
    SELECT 30 SeqValue
    UNION ALL
    SELECT 40 SeqValue
    UNION ALL
    SELECT 50 SeqValue
    UNION ALL
    SELECT 60 SeqValue
    UNION ALL
    SELECT 70 SeqValue
    UNION ALL
    SELECT 80 SeqValue
    UNION ALL
    SELECT 90 SeqValue
    ) TENS
CROSS JOIN
    (
    SELECT 0 SeqValue
    UNION ALL
    SELECT 100 SeqValue
    UNION ALL
    SELECT 200 SeqValue
    UNION ALL
    SELECT 300 SeqValue
    UNION ALL
    SELECT 400 SeqValue
    UNION ALL
    SELECT 500 SeqValue
    UNION ALL
    SELECT 600 SeqValue
    UNION ALL
    SELECT 700 SeqValue
    UNION ALL
    SELECT 800 SeqValue
    UNION ALL
    SELECT 900 SeqValue
    ) HUNDREDS) as a where seqValue != 0 limit 20;
...