Функция SQL для сопоставления ключа со значением

Я пытаюсь создать функцию SQL для сопоставления ключей со значениями. Цель состоит в том, чтобы перенести таблицу, содержащую имена часовых поясов Windows, в имя часового пояса iana, что-то вроде этого

Insert Into IanaTable (IanaTimezone)
Select TzConvert(WindowsTimeZone)
From WindowsTzTable

Я вижу, что существует около 50 часовых поясов Windows, и я готов написать ручное преобразование для этих 50 элементов. Я просмотрел некоторые другие ответы, но надеюсь не писать очень большую функцию IF/ELSE.

Функция SQL для управления значениями

Так в чем твой вопрос? На чем ты застрял?

Dale K 06.05.2022 08:09

Я хотел бы написать функцию без необходимости If A Return A1 If B return B1... 50 раз

qkhanhpro 06.05.2022 08:11

Как еще можно их сопоставить? Я предполагаю, что вы рассматривали возможность сохранения сопоставления в таблице?

Dale K 06.05.2022 08:15

Вот что мне интересно. Если бы в SQL Server было что-то вроде Javascript или C#, где мы могли бы просто временно определить карту/данные, вне логики управления, было бы абсолютно чисто сделать { "key1": "value1", "key2": "value2", "key3" : "value3"} И функция может просто вернуть myMap[inputKey] Это отделит логику от данных. Я не знаю, есть ли что-то подобное

qkhanhpro 06.05.2022 08:18

Абсолютно верно, она называется таблицей :) в конце концов, это реляционная база данных :). Создайте таблицу со столбцом для ключа и столбцом для значения, а затем запросите ее, когда вам нужно сопоставить значение.

Dale K 06.05.2022 08:20

Это также будет выполнять много лучше, чем функция.

Dale K 06.05.2022 08:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

IF используется для управления потоком. Для выражений просто используйте CASE:

Insert Into IanaTable (IanaTimezone)
    Select 
        case
            when CONDITION1 then RESULT1
            when CONDITION2 then RESULT2
            ......
            when CONDITION100 the RESULT100
        end as IanaTimezone         
    From WindowsTzTable

Обновлено: поскольку OP заявил, что они предпочли бы функцию, потому что одно и то же значение будет присвоено нескольким столбцам, я предлагаю боковое соединение для псевдонима выражения. Это лучше, так как даже копирование имени функции по-прежнему WET и ​​подвержено ошибкам. Здесь:

Insert Into IanaTable (...)
    Select 
         q1.IanaTimezone as column1
        ,q1.IanaTimezone as column2
        ,q1.IanaTimezone as column3
        ,othervalue      as othercolumn
        ......
    From 
        WindowsTzTable
        cross apply
        (
            Select 
            case
                when CONDITION1 then RESULT1
                when CONDITION2 then RESULT2
                ......
                when CONDITION100 the RESULT100
            end as IanaTimezone 
        ) as q1

Спасибо @George! Можете ли вы помочь мне переписать его в функцию? Я хотел бы немного упростить это, так как у меня на самом деле есть большая вставка, которая уже извлекает данные из других таблиц.

qkhanhpro 06.05.2022 08:14

Функции обычно имеют меньшую производительность. Вы имеете в виду, что существует несколько источников, поэтому вы не хотите писать одну и ту же формулу дважды?

George Menoutis 06.05.2022 08:18

Я имел в виду, что предложение INSERT INTO пытается вставить еще несколько столбцов (около 10), поэтому подумал, что было бы лучше переместить это преобразование/отображение в функцию, чтобы оно выглядело немного чище.

qkhanhpro 06.05.2022 08:22

Одно и то же значение для нескольких столбцов? Вы можете использовать cross apply для псевдонима. Я проиллюстрирую это в ответе.

George Menoutis 06.05.2022 08:24

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