0

曜日の有効性を表す0と1の文字列を持つDays列があります。これは、明確にするために、「MTWtFSs」(英語)や「LMmJVSD」などの文字列(言語によって異なります)にフォーマットまたは翻訳する必要があります。 (スペイン語)。

このコードは機能しますが、長すぎるようです。他のアイデアはありますか?

DECLARE @i INT = 0
       ,@DaysBits VARCHAR(7) = '110010'
       ,@DaysLetters VARCHAR(7) = ''
       ,@DaysMask VARCHAR(7) = 'MTWtFSs'
WHILE @i < 7 
      BEGIN
            SET @i = @i + 1
            IF ( SUBSTRING(@DaysBits, @i, 1) = 1 ) 
               SET @DaysLetters = @DaysLetters + SUBSTRING(@DaysMask, @i, 1)
            ELSE 
               SET @DaysLetters = @DaysLetters + '_' 
      END
SELECT  @DaysBits AS 'Days Bits'
       ,@DaysLetters AS 'Days Letters'
4

1 に答える 1

2

あなたはそれをcase

select case substring(@DaysBits, 1, 1) when 1 then substring(@DaysMask, 1, 1) else '_' end+
       case substring(@DaysBits, 2, 1) when 1 then substring(@DaysMask, 2, 1) else '_' end+
       case substring(@DaysBits, 3, 1) when 1 then substring(@DaysMask, 3, 1) else '_' end+
       case substring(@DaysBits, 4, 1) when 1 then substring(@DaysMask, 4, 1) else '_' end+
       case substring(@DaysBits, 5, 1) when 1 then substring(@DaysMask, 5, 1) else '_' end+
       case substring(@DaysBits, 6, 1) when 1 then substring(@DaysMask, 6, 1) else '_' end+
       case substring(@DaysBits, 7, 1) when 1 then substring(@DaysMask, 7, 1) else '_' end;

そして、それがあなたにとって少し多くのコードであるならば、あなたは数値表1-7を使用してfor xml path、値を連結することができます。

select
  (
  select case substring(@DaysBits, N, 1) when 1 then substring(@DaysMask, N, 1) else '_' end
  from (values(1),(2),(3),(4),(5),(6),(7)) as T(N)
  order by N
  for xml path('')
  );

SQLフィドル

于 2013-02-25T08:37:28.877 に答える