oracle 11将nvl2函数放在另一个nvl2函数中

时间:2015-11-27 16:02:46

标签: sql oracle

我们有名字,姓氏,中间名和前缀的单独字段。挑战是返回"姓氏,名字,中间名首字母。 。前缀#&34;包括所有逗号和小数。

我面临的问题是在初始nvl2中使用nvl2,如果中间的初始和/或前缀为null,则在字段中放置null。

{nvl2(lname, lname ||', '||fname ||' '||middle_initial ||' '|| prefix     ||'.'||null, null) as player,}
除非在中间的初始或前缀字段中有空值,否则

正常工作,在这种情况下,我们最终会得到至少一个无人值守的'。'

 {nvl2(lname, lname ||', '||fname ||' '|| middle_initial ||' '|| nvl2(prefix, prefix ||'.'||null), null) as player,}

返回'无效数量的参数'

到目前为止,我试图获得前缀修复,然后我认为中间的初始修复将遵循相同的语法模式。我已经尝试了上面显示的主题的多种变化,但还没有发现魔法药水。

非常感谢任何想法,见解或建议。

2 个答案:

答案 0 :(得分:1)

bool compare(const int *p0, const int *p1)
{
    return *p0 < *p1;
}

int main()
{
int a[8] = {7,5,0,6,4,2,3,1};
char b[8] = {'h','f','a','g','e','c','d','b'};
int *pa[8];
size_t i, j, k;
int ta;
char tb;
    // create array of pointers to a[]
    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
        pa[i] = &a[i];
    // sort array of pointers to a[]
    std::sort(pa, pa+sizeof(a)/sizeof(a[0]), compare);
    // reorder a[] and b[] according to the array of pointers to a[]
    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++){
        if(i != pa[i]-a){
            ta = a[i];
            tb = b[i];
            k = i;
            while(i != (j = pa[k]-a)){
                a[k] = a[j];
                b[k] = b[j];
                pa[k] = &a[k];
                k = j;
            }
            a[k] = ta;
            b[k] = tb;
            pa[k] = &a[k];
        }
    }
    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
        std::cout << a[i] << ' ';
    std::cout << std::endl;
    for(i = 0; i < sizeof(b)/sizeof(b[0]); i++)
        std::cout << b[i] << ' ';
    std::cout << std::endl;
    return 0;
}

答案 1 :(得分:0)

我认为这可以满足您的需求:

select (case when lname is null then '' else lname || ' ' end) ||
        case when fname is null then '' else fname || ' ' end) ||
        case when middle_initial is null then '' else middle_initial || '. ') ||
        prefix
       ) as name

我更喜欢coalesce(),因为它是ANSI标准。