我们有名字,姓氏,中间名和前缀的单独字段。挑战是返回"姓氏,名字,中间名首字母。 。前缀#&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,}
返回'无效数量的参数'
到目前为止,我试图获得前缀修复,然后我认为中间的初始修复将遵循相同的语法模式。我已经尝试了上面显示的主题的多种变化,但还没有发现魔法药水。
非常感谢任何想法,见解或建议。
答案 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标准。