Я хочу получить все департаменты во Франции. Их можно посчитать от 1 до 97, за исключением Корсики, которая имеет номера 2А и 2В.
Я сделал этот запрос, чтобы получить все числа (кроме Корсики):
WITH RECURSIVE dep as (
SELECT 1 as id
UNION ALL
SELECT id + 1 FROM dep WHERE id < 99
)
Но теперь я хочу заменить «20» на «2А» и «2В». Я пытался сделать это:
WITH RECURSIVE dep as (
SELECT 1 as id
UNION ALL
SELECT id + 1 FROM dep WHERE id < 99
UNION ALL
SELECT '2A'
UNION ALL
SELECT '2B'
)
Но я получаю эту ошибку: #1292 - Truncated incorrect DOUBLE value: '2B'
Вот что я хочу:
Как я могу это исправить?
@NicoHaase входных данных нет, рекурсивный метод работает сам по себе, я дам вам ожидаемый результат
Что вы подразумеваете под «работает один»? Обычная установка MariaDB даже не содержит таблицы с именем dep
, поэтому другие не могут воспроизвести проблему на основе текущей информации.
Этот вопрос не должен был быть закрыт. CTE на 100% самодостаточен и выдает набор результатов. Желаемые результаты объясняют результат. Вопрос ясен и имеет ответ.
Вопрос закрылся прежде, чем я успел ответить, но вот один способ... with recursive dep as (SELECT 1 as id UNION ALL SELECT id + 1 FROM dep WHERE id < 99) select cast(id as char) as id from dep where id <> 20 union select '2A' union select '2B'
.
@NicoHaase Посмотрите еще раз. Рекурсивный cte работает сам по себе и выдает набор результатов.
@JNeville ты прав, я неправильно прочитал код
@Isolated Это близко, но две проблемы: 1) Две дополнительные строки появятся не в заданной позиции в результате, а в конце после всех остальных строк. 2) Используйте UNION ALL
вместо UNION
для повышения производительности.
@JonasMetzler Спасибо, не был уверен, важен ли сорт, но понял.
@JonasMetzler Ни один из маршрутов не гарантирует порядок строк в выводе. Порядок — это всего лишь артефакт логики, который остается неизменным каждый раз, когда вы его запускаете. Если порядок очень важен, я бы добавил предложение ORDER BY
в оба решения, чтобы и СУБД, и всем остальным, кто сталкивается с этим кодом, было ясно, что порядок является намеренным и явным.
@JNeville Да, конечно, без ORDER BY
результат никогда не будет безопасным.
Вы можете создать новую производную таблицу с помощью cte или подзапроса, содержащего переведенные значения, а затем объединить ее с рекурсивным набором результатов cte:
WITH RECURSIVE dep as (
SELECT 1 as id
UNION ALL
SELECT id + 1 FROM dep WHERE id < 99
)
, id_translation AS
(
SELECT 20 as id, '2A' as alt_id
UNION ALL
SELECT 20, '2B'
)
SELECT COALESCE(idt.alt_id, dep.id) as id
FROM dep
LEFT OUTER JOIN id_translation idt
ON dep.id = idt.id
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 2A |
| 2B |
| 21 |
| 22 |
| .. |
+----+
Ваш CTE генерирует целое число, поэтому вы можете выполнить приведение. Вот один метод, если тип не имеет значения.
with recursive dep as (
SELECT 1 as id
UNION ALL
SELECT id + 1
FROM dep
WHERE id < 99
)
select cast(id as char) as id
from dep
where id <> 20
union select '2A'
union select '2B'
Нет необходимости CTE:
SELECT seq
FROM seq_1_to_95
WHERE seq != 20
UNION VALUES ('2A'), ('2B')
и откуда взялся seq_1_to_95
?
Пожалуйста, добавьте какое-нибудь объяснение к своему ответу, чтобы другие могли извлечь из него уроки.
Можете ли вы поделиться более подробной информацией, например данными из таблицы и ожидаемым результатом?