Использование функции в запросе, которая возвращает строку или ноль - PullRequest
0 голосов
/ 04 мая 2009

Я хочу объединить 2 таблицы 'addresses' и 'user_info' на user_id и app_id (который является числом, или это нуль), как эти 2 примера:

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id is null

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id = 1234

То, каким должен быть app_id, сложно, и я написал функцию для его возврата. Возвращает строку, которая будет, например, "is null" или "= 1234". Я пытаюсь вызвать его с помощью следующего синтаксиса:

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id dbo.fnGetAppId(addresses.user_id)

Я получаю эту ошибку:

Сообщение 4145, уровень 15, состояние 1, строка 3 An выражение небулева типа указано в контексте, где ожидается состояние, около 'dbo'.

Я хотел бы сделать запрос очень простым, поскольку он не требует определения, возвращает ли функция нулевое значение или нет.

Можете ли вы предложить лучший способ сделать вызов очень простым?

(я в sql server 2005.)

Ответы [ 4 ]

0 голосов
/ 04 мая 2009

Как указал Джеймс Блэк, у вас есть И где вы, вероятно, хотите ГДЕ. Кроме того, я предлагаю вам сделать функцию булевой (передавая address.app_id в качестве еще одного аргумента), чтобы она могла выполнить IS NULL или = 1234 в зависимости от ситуации (решение Билла COALESCE действительно умное, но с соответствующим сравнением внутри функция более простая, IMO).

0 голосов
/ 04 мая 2009

Итак, если fnGetAppId равен нулю, тогда этот запрос выглядит следующим образом?

select * from user_info left outer join addresses on addresses.user_id = user_info.user_id and null

Я сомневаюсь, что это то, что вы хотите. :)

Вы можете захотеть сделать простую проверку в своей логике перед вызовом запроса, чтобы правильно обработать нуль для fnGetAppId, и, как упоминал Клайд, вам также нужен знак = для ненулевого

.

0 голосов
/ 04 мая 2009

NULL! = NULL. Если address.app_id = NULL или fnGetAppID = NULL, сравнение не удастся. Я бы написал сравнение как:

coalesce(address.app_id, 'NULLSTRING') = coalesce(dbo.fnGetAppID(addresses.user_id), 'NULLSTRING')

0 голосов
/ 04 мая 2009

Похоже, вы просто пропускаете знак = 1001 *

address.app_id dbo.fnGetAppId (address.user_id)

вместо

address.app_id = dbo.fnGetAppId (address.user_id)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...