Получите коды всех департаментов Франции, включая Корсику

Я хочу получить все департаменты во Франции. Их можно посчитать от 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'

Вот что я хочу:

идентификатор 1 2 3 [вывод опущен...] 17 18 19 2А 2Б 21 22 ...

Как я могу это исправить?

Можете ли вы поделиться более подробной информацией, например данными из таблицы и ожидаемым результатом?

Nico Haase 12.06.2024 15:32

@NicoHaase входных данных нет, рекурсивный метод работает сам по себе, я дам вам ожидаемый результат

Elikill58 12.06.2024 15:34

Что вы подразумеваете под «работает один»? Обычная установка MariaDB даже не содержит таблицы с именем dep, поэтому другие не могут воспроизвести проблему на основе текущей информации.

Nico Haase 12.06.2024 15:47

Этот вопрос не должен был быть закрыт. CTE на 100% самодостаточен и выдает набор результатов. Желаемые результаты объясняют результат. Вопрос ясен и имеет ответ.

JNevill 12.06.2024 15:54

Вопрос закрылся прежде, чем я успел ответить, но вот один способ... 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'.

Isolated 12.06.2024 15:56

@NicoHaase Посмотрите еще раз. Рекурсивный cte работает сам по себе и выдает набор результатов.

JNevill 12.06.2024 15:59

@JNeville ты прав, я неправильно прочитал код

Nico Haase 12.06.2024 16:06

@Isolated Это близко, но две проблемы: 1) Две дополнительные строки появятся не в заданной позиции в результате, а в конце после всех остальных строк. 2) Используйте UNION ALL вместо UNION для повышения производительности.

Jonas Metzler 12.06.2024 16:07

@JonasMetzler Спасибо, не был уверен, важен ли сорт, но понял.

Isolated 12.06.2024 16:09

@JonasMetzler Ни один из маршрутов не гарантирует порядок строк в выводе. Порядок — это всего лишь артефакт логики, который остается неизменным каждый раз, когда вы его запускаете. Если порядок очень важен, я бы добавил предложение ORDER BY в оба решения, чтобы и СУБД, и всем остальным, кто сталкивается с этим кодом, было ясно, что порядок является намеренным и явным.

JNevill 12.06.2024 16:33

@JNeville Да, конечно, без ORDER BY результат никогда не будет безопасным.

Jonas Metzler 12.06.2024 16:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
11
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете создать новую производную таблицу с помощью 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?

Elikill58 13.06.2024 08:15
mariadb.com/kb/en/sequence-storage-engine
yotheguitou 13.06.2024 09:06

Пожалуйста, добавьте какое-нибудь объяснение к своему ответу, чтобы другие могли извлечь из него уроки.

Nico Haase 13.06.2024 09:12

Другие вопросы по теме