【Oracle】CASE句はネスト可能

そのまんま。
CASE句で分岐した値に対して、更にこうだったら。。。ってできる。

OTN Japan - 404 Error

CASE TBL1.A
    WHEN 0 THEN
        CASE TBL2.B
            WHEN 0 THEN 0
            WHEN 1 THEN 1
        END
    WHEN 1 THEN
        CASE TBL2.B
            WHEN 0 THEN 2
            WHEN 1 THEN 3
        END
    ELSE NULL
    END

重くなりそうなんで不必要にやったらまずいのかな。
プログラム側である程度絞れるんなら絞ってあげたいですかね。

【Oracle】特定の名称だけ優先して先頭に表示した上で、他はORDER BYする方法

OracleでORDER BY句使うとき、ある項目だけ先頭に出して、他は昇順ソート、とかしたい時。。
具体的には国名リスト出すとき日本を最上段に持ってきて、あとは五十音順とか。
CASE句を使う素敵な方法があったのでメモ。

2010-01-15

select
  country_name
from
  t_country
order by
  case country_name when 'Japan' then 1 else 2 end,
  country_name

第一条件でJapanを1に置き換え、他は2としてソート。これでJapanが先頭に来る。
あとは第二条件で普通に国名を指定する。
賢いなぁ。。

Mapを拡張for文使って動かす

Listはこんな感じ

for (User user : userList) {
    user.showName();
}

で拡張For文使えるけど、Mapはどうなんかな?
全要素らくらく出せたら素敵やん?と思っていたら方法があったのでメモ。

JavaのMapを拡張for文(for-each)でループする - やままの間っ!

for (Map.Entry<String, String> e : map.entrySet()) {
    System.out.println(e.getKey() + " : " + e.getValue());
}

map.entrySet()でMapの中身をごそっと持ってきて、ぐるぐる回す。
ちなみに、普通にmap.keySet()でキー値を持ってきて、e.getValue()で取ってくるよりもこちらの方が高速らしいので、
Mapの中身を全部取ってくる=entrySet()で覚えちゃったほうがいいのかな。

javaでビット演算(権限をビットで持つやり方)

恥ずかしながらJavaでのビット演算について知らなかったんでメモ。

for (int i = 0; i <= 5; i++) {
    for (int j = 6; j <= 10; j++) {
        System.out.println(Integer.toBinaryString(i) + "と");
        System.out.println(Integer.toBinaryString(j) + "のBITAND");
        System.out.println(i & j);
        System.out.println("");
    }
}


出力結果
0と
110のBITAND
0

(中略)

1と
110のBITAND
0

1と
111のBITAND
1

(中略)

10と
110のBITAND
2

10と
111のBITAND
2


論理積がtrueになるビットが出力できる。。

〜〜 10進数から2進数への変換 〜〜
Integer.toBinaryString(4) とかで、4を2進数で表した値である100が取れる。
Longにも同名のメソッドがあるが、別にInteger.toBinaryStringの引数にIntegerの最大値以上の値を入れても
問題なく変換してくれるので、どっちを使っても問題なし。

〜〜 2進数から10進数への変換 〜〜
Integer.parseInt("100",2) で100を10進数で表した値である4が取れる。
こっちはInteger型の範囲内に変換後の値が収まる必要があるので、
10000000000000000000000000000000以上の2進数を扱う場合はLong.parseLongを使う。

〜〜 権限制御するやり方 〜〜
DBに○○権限フラグ、××権限フラグ〜とかってカラムを持ってると、権限が増えた!って時に
いちいちカラム追加してあげないといけない。。影響範囲が大きいので、2進数のビットで表現するといいかも。

登録権限、編集権限、参照権限を3ビットでもつ場合は
000〜111の文字列で持っておくとか。

static final String AUTH_INSERT = "100";
static final String AUTH_UPDATE = "010";
static final String AUTH_SELECT = "001";

public static void main(String args[]){
    String[] users = {"101", "001", "000"};

    for (String user : users) {
        checkAuthority(user);
    }
}

private static void checkAuthority(String  userAuth){   

    boolean isEnemy = true;

    System.out.println("");
    System.out.println("いらっしゃい!");
    if ((Integer.parseInt(AUTH_INSERT) & Integer.parseInt(userAuth)) > 0) {
        System.out.println("登録権限を持っているユーザです。");
        isEnemy = false;
    }
    if ((Integer.parseInt(AUTH_UPDATE) & Integer.parseInt(userAuth)) > 0) {
        System.out.println("更新権限を持っているユーザです。");
        isEnemy = false;
    }
    if ((Integer.parseInt(AUTH_SELECT) & Integer.parseInt(userAuth)) > 0) {
        System.out.println("参照権限を持っているユーザです。");
        isEnemy = false;
    }

    if (isEnemy) {
        System.out.println("侵入者には死を!");
    } else {
        System.out.println("また来てね!");
    }
}


実行結果は以下の通り。

いらっしゃい!
登録権限を持っているユーザです。
参照権限を持っているユーザです。
また来てね!

いらっしゃい!
参照権限を持っているユーザです。
また来てね!

いらっしゃい!
侵入者には死を!

Intent

サンプルを漁って画面遷移をどうやるのか?について調べてみたら、
Intentというのがキーワードに上がってきた。

画面自体はEclipseでswingみたいに部品をペタペタ貼ってく感じでできるんだけど、
画面遷移に特徴があって、それがこのIntentによって実現されているみたいな。
表示領域が1つでそこに異なる画面を表示させて遷移するんでなく、
1クラス=1画面で、Intentを使って呼び出しを繰り返す感じ。

http://www.atmarkit.co.jp/fsmart/articles/android03/android03_2.html

'adb'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。

環境設定してさーてサンプルでもとりあえず実行してみるかっておもったら、
eclipseでエラー。
shellでadbコマンドを実行して下さいとのこと。

で、コマンドプロンプト立ち上げてadbコマンド実行したらタイトルのメッセージが。
Pathもきってるのに何故・・・。
と思って、andoroid-sdkインストールフォルダ配下のtool見たらadb.exeが確かにない。
その代わりadb_has_moved.txtってファイルが。。。以下内容。

The adb tool has moved to platform-tools/

If you don't see this directory in your SDK,
launch the SDK and AVD Manager (execute the android tool)
and install "Android SDK Platform-tools"

Please also update your PATH environment variable to
include the platform-tools/ directory, so you can
execute adb from any location.

というわけで、Pathにtoolsだけでなくplatform-toolsも追加したら問題なくadbコマンド実行できました。