MW211 EXIT

devlog
IE/別タブで開く
2013年02月05日
HTMLの設定以外で、リンク先を別タブで開く方法として有名なのが
右クリックメニューから「新しいタブで開く」を選択することではないだろうか。

実は簡単に別タブで開く方法がある。

マウスの中央についている「マウスホイール」をクリックする方法だ。
たったこれだけで別タブでリンク先のページが開かれる。

しかし、既定だと、そのタブは裏タブとなってしまう。
これを表タブにする方法としては、以下の設定を変更すればよい(チェックを入れる)。
「インターネットオプション→全般(タブ)→設定ボタン
  →■新しいタブの作成時には常に新しいタブへ移動する」
分類:ブラウザ
PostgreSQL/avg()とNULL
2013年02月04日
「AVG()」は平均を計算する集合関数。
┌──────────────────────────────────────┐
│SELECT avg("c") FROM (VALUES (1),(2),(3)) AS "t"("c");                   →2│
└──────────────────────────────────────┘
「(1+2+3)÷3=2」となる。

では、母集団にNULLが混じっていた場合には?
┌──────────────────────────────────────┐
│SELECT avg("c") FROM (VALUES (1),(2),(NULL)) AS "t"("c");              →1.5│
└──────────────────────────────────────┘
NULLは無視される。で、「(1+2)÷2=1.5」となる。

ではでは、母集団がすべてNULLだった場合は?
┌──────────────────────────────────────┐
│SELECT avg("c"::numeric)                                                    │
│    FROM (VALUES (NULL),(NULL),(NULL)) AS "t"("c");                   →NULL│
└──────────────────────────────────────┘
「NULL」になる

ついでに、母集団がなかった場合には?
┌──────────────────────────────────────┐
│SELECT avg("c") FROM (VALUES (1),(2),(3)) AS "t"("c") WHERE FALSE;    →NULL│
└──────────────────────────────────────┘
これも「NULL」になる。

集合関数は、とにかく結果を一つ返して、
値を返すのが無理そうな時はNULLを返すって感じか。
分類:PostgreSQL
PHP/foreach()とexplode()とNULLと
2013年02月03日
「foreach()」で回す配列がNULLだったらNG。「foreach (NULL as $value)」

では、「explode()」を経由するんだけど、元ネタがNULLだった場合は?
┌──────────────────────────────────────┐
│foreach ((explode(',', NULL)) as $value) {                                  │
│}                                                                           │
└──────────────────────────────────────┘
こいつはOK。

「var_dump()」で「explode(',', NULL)」を探ってみると…。
┌──────────────────────────────────────┐
│array(1) { [0]=> string(0) "" }                                             │
└──────────────────────────────────────┘
ダミーの配列を作って(空文字を入れて)くれるみたいだ。
分類:PHP
PostgreSQL/続・NULLの処遇のおさらい
2013年02月02日
ついでに、グループごとの最大値もしくは最小値を含む明細を抽出する場合に
NULLを最劣後にするSQL文も記録にとどめておこう。

まずは最小値を含む明細を求める方法。
┌──────────────────────────────────────┐
│SELECT DISTINCT ON ("k") "k","c","s"                                        │
│    FROM (VALUES ('g',1,'a'),('g',2,'b'),('g',NULL,'c')) AS "t"("k","c","s")│
│    ORDER BY "k"         ASC,                                               │
│             "c" IS NULL ASC,                                               │
│             "c"         ASC;                                      →(g,1,a)│
└──────────────────────────────────────┘

次に最大値を含む明細を求める方法。
┌──────────────────────────────────────┐
│SELECT DISTINCT ON ("k") "k","c","s"                                        │
│    FROM (VALUES ('g',1,'a'),('g',2,'b'),('g',NULL,'c')) AS "t"("k","c","s")│
│    ORDER BY "k"         ASC,                                               │
│             "c" IS NULL ASC,                                               │
│             "c"         DESC;                                     →(g,2,b)│
└──────────────────────────────────────┘

つまり、最後のORDERだけ逆(ASC←→DESC)にすればよいだけ。
ちなみに、「"k" ASC」は疑似「GROUP BY」なので、「"k" DESC」でもOK。
ついでに「"c" IS NULL ASC」は「"c" IS NOT NULL ASC」か「"c" IS NULL DESC」に
すれば、NULLが先頭にくる。
分類:PostgreSQL
PostgreSQL/NULLの処遇のおさらい
2013年02月01日
レコード上にNULLが混じっていた場合どうなるのか、
以下のサンプルデータを元におさらいしてみよう。
┌──────────────────────────────────────┐
│SELECT "c" FROM (VALUES (1),(2),(NULL)) AS "t"("c");            →1、2、NULL│
└──────────────────────────────────────┘

まずは、集合関数について。
┌──────────────────────────────────────┐
│SELECT COUNT("c") FROM (VALUES (1),(2),(NULL)) AS t("c");                →2│
│SELECT MAX("c")   FROM (VALUES (1),(2),(NULL)) AS t("c");                →2│
│SELECT MIN("c")   FROM (VALUES (1),(2),(NULL)) AS t("c");                →1│
│SELECT AVG("c")   FROM (VALUES (1),(2),(NULL)) AS t("c");              →1.5│
└──────────────────────────────────────┘
NULLはガン無視されるということだね。

次は並び順について。
┌──────────────────────────────────────┐
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" ASC;                                           →1、2、NULL│
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" DESC;                                          →NULL、2、1│
└──────────────────────────────────────┘
ただし、現状はこうですよって感じで、この順は保証されてないっぽい。

ま、動いてんだから…ってのはよくないですよね。
じゃ、NULLを厳密に管理するには?
┌──────────────────────────────────────┐
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" IS NULL ASC,                                               │
│             "c"         ASC;                                   →1、2、NULL│
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" IS NULL DESC,                                              │
│             "c" DESC;                                          →NULL、2、1│
└──────────────────────────────────────┘
並び順に「IS NULL」をつけてやればよい。
分類:PostgreSQL
PostgreSQL/配列を集約してさらに配列化
2013年01月30日
「ARRAY_AGG()」では配列をさらに配列として集約するのはできないのだろうか。
┌──────────────────────────────────────┐
│SELECT ARRAY_AGG(c) FROM (VALUES (ARRAY[1,2]),(ARRAY[3,4])) AS t(c);        │
└──────────────────────────────────────┘
ってやると以下のエラーがでる。(integer型に限った話ではなくtext型も)
「ERROR:  could not find array type for data type integer[]」

┌──────────────────────────────────────┐
│SELECT ARRAY_AGG(ROW(c)) FROM (VALUES (ARRAY[1,2]),(ARRAY[3,4])) AS t(c);   │
└──────────────────────────────────────┘
ROW式ってやつを使って見ると「{"(\"{1,2}\")","(\"{3,4}\")"}」という結果になる。

┌──────────────────────────────────────┐
│SELECT ARRAY_TO_STRING(ARRAY_AGG(ROW(c)),',')                               │
│    FROM (VALUES (ARRAY[1,2]),(ARRAY[3,4])) AS t(c);                        │
└──────────────────────────────────────┘
で、文字列に変換するとこうなる。「("{1,2}"),("{3,4}")」

配列を配列として集約、多次元配列的になるようだ。

ただし、求めたいのは「{1,2,3,4}」という結果。
一次元の配列にする方法はあるのだろうか?

ま、代案としては、CSV形式の文字列とかにして、最後に配列にするとかか。
分類:PostgreSQL、【未解決】
PostgreSQL/横のmin()とmax()
2013年01月27日
min()とmax()は行を跨いで、最小値および最大値を取得できるわけだが…。
┌──────────────────────────────────────┐
│SELECT min(列) FROM 表;                                                     │
│SELECT max(列) FROM 表;                                                     │
└──────────────────────────────────────┘

列を跨いで、最小値および最大値を取得する方法がある。これだ。
┌──────────────────────────────────────┐
│SELECT least(列,列…);                                                      │
│SELECT greatest(列,列…);                                                   │
└──────────────────────────────────────┘

こんな感じになる。
┌──────────────────────────────────────┐
│SELECT least(1,2,3);                                                     →1│
│SELECT greatest(1,2,3);                                                  →3│
└──────────────────────────────────────┘
分類:PostgreSQL
PostgreSQL/generate_series()の入れ子
2013年01月26日
AS演算子で別名にすりゃいい。
┌──────────────────────────────────────┐
│SELECT (SELECT array_agg(t1.c1 || '-' || t2.c1)                             │
│            FROM generate_series(1, 2, 1) AS t2(c1))                        │
│    FROM generate_series(1, 3, 1) AS t1(c1);                                │
└──────────────────────────────────────┘

但し、表名だけを別名にしてもダメ(列名も必要)だから注意。
┌──────────────────────────────────────┐
│SELECT (SELECT array_agg(t1.generate_series || '-' || t2.generate_series)   │
│            FROM generate_series(1, 2, 1) AS t2)                            │
│    FROM generate_series(1, 3, 1) AS t1;                                    │
└──────────────────────────────────────┘
分類:PostgreSQL
PostgreSQL/一時的な疑似テーブル
2013年01月18日
┌──────────────────────────────────────┐
│(VALUES(値,値),(値,値)) AS 表(列,列)                                        │
└──────────────────────────────────────┘
上記のような書式で一時的な疑似テーブルをつくることができる。

以下のような感じで使える。
┌──────────────────────────────────────┐
│SELECT * FROM (VALUES(1,'a'),(2,'b')) AS t(c1,c2);                          │
└──────────────────────────────────────┘
分類:PostgreSQL
JavaScript/残り文字数とアンドゥ
2013年01月17日
textareaタグの長文入力欄の文字数制限を実装する上で、
補助的に入力の度に残り文字数を更新するようにした。

ところが、この結果アンドゥ(ctrl+z)が効かなくなってしまった。

文字数を更新表示することにより、
入力した内容が確定してアンドゥが効かなくなるようだ。

長文入力する上で、アンドゥが効かないのは非常につらい。

ということで、残り文字数の表示は断念。

なんかいい代替案はないものか。
分類:JavaScript
前へ 1 … 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 … 156 次へ