1

非常に古い変数のマングルを解除しようとしています。それは 1 つのフィールドにすべて入力された氏名であり、2 つの別々のテーブルにあります。ほとんどの新しい場所では、名前は 3 つの論理列 (first、middle、last) にあります。これらはすべて一緒であり、私はそれを最初のイニシャル、姓に取り除こうとしています. ここで以下を見つけて修正しました。

http://dbaspot.com/sqlserver-programming/365656-find-last-word-string.html

 DECLARE @full_name VARCHAR(20)
 DECLARE @fullname VARCHAR(20)
 SELECT @full_name = REVERSE('John A Test')
 SELECT @fullname = REVERSE('Joe Q Public')

 SELECT @final = ISNULL(
                 (right(@full_name,1) + '.  ' + (REVERSE(SUBSTRING(@full_name, 1, 
                                                   CHARINDEX(' ',@full_name) - 1)))), 

                  (right(@fullname,1) + '.  ' + (REVERSE(SUBSTRING(@fullname, 1, 
                                                   CHARINDEX(' ',@fullname) - 1 ))))
                        )

そこに full_name を残すと、正常に動作します... が返されますJ. Test。私がそれを無効にすると、デフォルトは になるはずですが
J. Public、代わりに.. 各行を個別にテストすると、機能します。同じ結果で COALESCE も試しました。これは、ISNULL または ???? に対して括弧が多すぎますか?

4

1 に答える 1

1

right(@full_name,1) + '. 'たとえば、次のような問題があります。

select null+'.'

を与えます.

case以下のようにコードを変更してみてください。

 DECLARE @full_name VARCHAR(20)
 DECLARE @fullname VARCHAR(20)
 DECLARE @final VARCHAR(20)
 SELECT @full_name = null--REVERSE('John A Test')
 SELECT @fullname = REVERSE('Joe Q Public')

 SELECT @final = case
                    when @full_name is not null
                       then (right(@full_name,1) + '.  ' + (REVERSE(SUBSTRING(@full_name, 1, 
                                                   CHARINDEX(' ',@full_name) - 1))))
                    else (right(@fullname,1) + '.  ' + (REVERSE(SUBSTRING(@fullname, 1, 
                                                   CHARINDEX(' ',@fullname) - 1 ))))
                 end 
select @final         
于 2012-09-19T07:08:17.370 に答える