SQL - 如何根据参数从不同的表中返回值?

时间:2015-06-22 23:00:39

标签: sql-server

SQL - 如何根据参数从不同的表中返回值 第一次海报,长期读者: 我正在使用自定义Excel函数,它允许传递参数并构建一个返回值的SQL字符串。这工作正常。但是,我想根据传递的参数在各种表中进行选择。

目前我有两个使用SQL语句的工作函数如下所示:

_______功能一________

<SQLText>
SELECT PRODDTA.TABLE1.T1DESC as DESCRIPTION
FROM PRODDTA.TABLE1
WHERE PRODDTA.TABLE1.T1KEY = '&amp;PARM02'</SQLText> 

_______功能二________

<SQLText>
SELECT PRODDTA.TABLE2.T2DESC as DESCRIPTION 
FROM PRODDTA.TABLE2 
WHERE PRODDTA.TABLE2.T2KEY = '&amp;PARM02'</SQLText>

所以我在Excel中使用IF逻辑来检查第一个参数并决定使用哪个函数。

如果我能做一个可以根据第一个参数选择正确的表的SQL语句会好得多。逻辑上是这样的:

_______功能组合________

IF '&amp;PARM02' = “A” THEN

SELECT PRODDTA.TABLE1.T1DESC as DESCRIPTION 
FROM PRODDTA.TABLE1 
WHERE PRODDTA.TABLE1.T1KEY = '&amp;PARM02'

ELSE IF '&amp;PARM02' = “B” THEN

SELECT PRODDTA.TABLE2.T2DESC as DESCRIPTION 
FROM PRODDTA.TABLE2 
WHERE PRODDTA.TABLE2.T2KEY = '&amp;PARM02'

ELSE
DESCRIPTION = “”

基于另一篇帖子Querying different table based on a parameter,我尝试了这种确切的语法,但没有成功

<SQLText>
IF'&amp;PARM02'= "A"
BEGIN
SELECT PRODDTA.F0101.ABALPH as DESCRIPTION
FROM PRODDTA.F0101 
WHERE PRODDTA.F0101.ABAN8 = '&amp;PARM02'
END ELSE
BEGIN
SELECT PRODDTA.F4801.WADL01 as DESCRIPTION
FROM PRODDTA.F4801 
WHERE PRODDTA.F4801.WADOCO = '&amp;PARM02'
END</SQLText>

2 个答案:

答案 0 :(得分:0)

您可以尝试使用JOIN语句。

http://www.sqlfiddle.com/#!9/23461d/1

这是一个显示两个表的小提琴。 以下代码片段将使用Key作为匹配逻辑,为您提供两个表中的值。

$scope.newincidents = [];
$scope.NextIncidents = function() {
    var urlnext = $scope.nextincidents;

    if (!urlnext) {
        $("#infinite").prop("disabled", true);
    } else {
        $("#infinite").prop("disabled", false);
    }

    var mycookie = $cookieStore.get('Token');
    $http({
        method: 'GET',
        url: urlnext,
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'X-Token': '\UsernameToken Token="' + mycookie + '"',
        },
    }).success(function(data, status) {
        $scope.newincidents = data._embedded.incidents;
        var nextLink = data._links.next;
        $scope.nextincidents = nextLink ? nextLink.href : null;

        for (var n in $scope.incidents) {
            var month = new Date($scope.newincidents[n].upload_date).getMonth();
            $scope.incidents.push($scope.newincidents[n]);
            $scope.loadIncidents();

        };

    }).error(function(data, status, headers, config) {
        return false;
    });
    $scope.loadIncidents();
};

答案 1 :(得分:0)

这是一种方法。如果PARM03 =&#39;使用表1&#39;然后联盟的上半部分将返回记录,反之亦然。尽管如此,这不一定是产品的良好表现。您应该考虑以这种方式存储数据的原因。看起来你在不同的表中划分数据这是一个坏主意。

SELECT PRODDTA.TABLE1.T1DESC as DESCRIPTION 
FROM PRODDTA.TABLE1 
WHERE PRODDTA.TABLE1.T1KEY = '&amp;PARM02'
AND &amp;PARM03='Use Table1'
UNION ALL
SELECT PRODDTA.TABLE2.T2DESC as DESCRIPTION 
FROM PRODDTA.TABLE2 
WHERE PRODDTA.TABLE2.T2KEY = '&amp;PARM02'</SQLText>
AND &amp;PARM03='Use Table2'