t-sql выберите один столбец, если запись существует, другой столбец, если нет

Мне часто приходится выбирать значение из одной из двух разных таблиц, tableA и tableB. Если в таблице A существует определенная запись, я беру значение из таблицы A. Если запись не существует, вместо этого мне нужно значение из tableB.

Я работаю с приложением ERP, которое создаст запись на основе событий в таблице адресов доставки заказов на продажу, если пользователь изменит адрес доставки по умолчанию при вводе заказа на продажу. Если пользователь не меняет адрес доставки, система предполагает, что продукт отгружается по адресу, указанному в файле клиента, и ничего не записывает в таблицу доставки заказа на продажу. Мне нужен адрес доставки для каждой отгрузки заказа на продажу, но я не могу безопасно получить его непосредственно из таблицы A или таблицы B.

То, что я делал в прошлом, выглядит примерно так:

SELECT
    CASE 
        WHEN isnull(tableA.SalesOrderNumber, 'StackOverflow') = 'StackOverflow'
            THEN tableB.address1
        ELSE tableA.address1
        END AS address1

Который работает. Но тогда вы в конечном итоге повторяете одно и то же снова и снова для каждого поля с похожей логикой, что отстой, но это не является неработоспособным, если значение, которое вы проверяете (SalesOrderNumber), является символьными данными и/или первичным ключом. Если значение, которое я проверяю, не является первичным ключом или если это данные числового типа, тогда этот подход становится гораздо более хрупким.

Должен быть лучший способ, верно?

Я пробовал несколько разных подходов с оператором EXISTS и ничего не добился.


person 3xStampA2xStamp    schedule 10.09.2014    source источник
comment
почему бы вам не использовать функцию, если вам часто нужны такие вещи   -  person masum7    schedule 10.09.2014
comment
концепция повторяется, а механика нет. Кроме того, я делаю это для целей отчетности, поэтому я должен иметь возможность включить его в представление. вызов 9 разных скалярных функций для 9 разных полей для каждой строки в результирующем представлении будет чертовски медленным   -  person 3xStampA2xStamp    schedule 10.09.2014
comment
Если вы можете изменить структуру базы данных, я бы предложил другой подход: вместо того, чтобы создавать эти большие беспорядочные представления, я бы предложил добавить эти 9 столбцов в таблицу заказов, и когда клиент отправляет форму заказа, заполнить эти столбцы значениями, которые поступает либо из сохраненных данных клиента, либо из формы. Вам все равно придется делать дело... когда для 9 полей, но только в одном месте.   -  person Zohar Peled    schedule 10.09.2014


Ответы (1)


Если я понимаю вашу задачу, вы можете присоединиться к своему tableA, чтобы проверить существование конкретной записи - если запись не существует, у вас будет NULL для объединенных значений, в противном случае у вас будет какое-то значение. Затем в случае значения NULL вы можете заменить его значением из tableB. Что-то вроде этого:

SELECT COALESCE(tA.address1, tB.address1, N'N/A') AS address1
    FROM tableWithSalesOrderNumbers AS tWSON
             LEFT JOIN tableA AS tA
                 ON tA.SalesOrderNumber = tWSON.SalesOrderNumber
             LEFT JOIN tableB AS tB
                 ON tB.SalesOrderNumber = tWSON.SalesOrderNumber
person Serg    schedule 10.09.2014
comment
Это чертовски блестяще, не говоря уже о гораздо более элегантном. Я никогда раньше не использовал Coalesce(), но я знал, что делаю это намного сложнее, чем нужно. Спасибо - person 3xStampA2xStamp; 11.09.2014