bugfix> sql > 投稿

各値が9文字(col1)の列があります。 col1の最後の4文字を取得し、値が0001〜0879の範囲にあるかどうかを確認する必要があります。この文字列には文字が含まれている可能性があります。

初期テーブル

col1       column2
585550529  red
589960MNO  blue
849828415  green

期待される結果

col1       column2  column3
585550529  red      True
589960MNO  blue     False
849828415  green    False
SELECT col1, 
       col2, 
       CASE WHEN RIGHT(col1,4) IN('0001','0002','0003') THEN 'true' ELSE 'false' END
FROM table

とにかく、INステートメント内ですべての879文字列を入力することなくこれを行う方法はありますか?これはいものになります。

回答 3 件
  • BETWEENを使用できます

    ...
    CASE WHEN RIGHT(col1,4) between  '0001' and '0879' THEN 'true' ELSE 'false' END
    ...
    
    

  • どうですか:

    SELECT col1, 
           col2, 
           CASE WHEN 
             isnumeric(RIGHT(col1,4)) and 
             cast(RIGHT(col1,4) as int) between 0 and 879
               THEN 'true' 
               ELSE 'false' 
           END
    FROM table
    
    

  • PATINDEXを使用してこれを試してください

    ;WITH CTE(col1,column2)
    AS
    (
    SELECT '585550529','red' UNION ALL
    SELECT '589960MNO','blue' UNION ALL
    SELECT '849828415','green'
    )
    SELECT col1,column2,CASE WHEN  newcol BETWEEN 1 AND  0879 THEN  'True'  ELSE 'False'  END AS column3
    FROM
    (
    SELECT col1,
          column2,
          CAST(CASE WHEN PATINDEX('%[A-Z a-z]%',RIGHT(col1,4)) = 0 THEN RIGHT(col1,4)  ELSE ' '  END AS INT) newcol,
          CASE WHEN PATINDEX('%[A-Z a-z]%',RIGHT(col1,4)) = 0 THEN 'True'  ELSE 'False'  END  getcol
    FROM CTE
    ) Dt
    
    

    結果

    col1        column2 column3
    ----------------------------
    585550529   red     True
    589960MNO   blue    False
    849828415   green   False
    
    

あなたの答え