Я пытаюсь создать функцию SQL для сопоставления ключей со значениями. Цель состоит в том, чтобы перенести таблицу, содержащую имена часовых поясов Windows, в имя часового пояса iana, что-то вроде этого
Insert Into IanaTable (IanaTimezone)
Select TzConvert(WindowsTimeZone)
From WindowsTzTable
Я вижу, что существует около 50 часовых поясов Windows, и я готов написать ручное преобразование для этих 50 элементов. Я просмотрел некоторые другие ответы, но надеюсь не писать очень большую функцию IF/ELSE.
Я хотел бы написать функцию без необходимости If A Return A1 If B return B1... 50 раз
Как еще можно их сопоставить? Я предполагаю, что вы рассматривали возможность сохранения сопоставления в таблице?
Вот что мне интересно. Если бы в SQL Server было что-то вроде Javascript или C#, где мы могли бы просто временно определить карту/данные, вне логики управления, было бы абсолютно чисто сделать { "key1": "value1", "key2": "value2", "key3" : "value3"} И функция может просто вернуть myMap[inputKey] Это отделит логику от данных. Я не знаю, есть ли что-то подобное
Абсолютно верно, она называется таблицей :) в конце концов, это реляционная база данных :). Создайте таблицу со столбцом для ключа и столбцом для значения, а затем запросите ее, когда вам нужно сопоставить значение.
Это также будет выполнять много лучше, чем функция.
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! Можете ли вы помочь мне переписать его в функцию? Я хотел бы немного упростить это, так как у меня на самом деле есть большая вставка, которая уже извлекает данные из других таблиц.
Функции обычно имеют меньшую производительность. Вы имеете в виду, что существует несколько источников, поэтому вы не хотите писать одну и ту же формулу дважды?
Я имел в виду, что предложение INSERT INTO пытается вставить еще несколько столбцов (около 10), поэтому подумал, что было бы лучше переместить это преобразование/отображение в функцию, чтобы оно выглядело немного чище.
Одно и то же значение для нескольких столбцов? Вы можете использовать cross apply
для псевдонима. Я проиллюстрирую это в ответе.
Так в чем твой вопрос? На чем ты застрял?