MW211 EXIT

devlog
PostgreSQL/MAX()・MIN()とORDER BY&LIMIT 1
2012年08月09日
単純なMAX()やMIN()なら、ORDER BY&LIMIT 1にした方が若干速いらしい。
┌──────────────────────────────────────┐
│SELECT MAX(列) FROM 表;                                                     │
├──────────────────────────────────────┤
│SELECT 列 FROM 表 ORDER BY 列 DESC LIMIT 1;                                 │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│SELECT MIN(列) FROM 表;                                                     │
├──────────────────────────────────────┤
│SELECT 列 FROM 表 ORDER BY 列 ASC LIMIT 1;                                  │
└──────────────────────────────────────┘

大量データの時は一考かも。
ただ、文が長くなるし、他の集合関数と併用できないとか制約はある。
分類:PostgreSQL
PHP/セッションファイルの境界線
2012年08月08日
セッションファイルはブラウザ毎に一つのセッションファイルを共有する

つまりセッションファイルの共有状況の境界線は以下のような感じとなる。

  タブが異なる        │セッションファイルが同じ
  ウインドウが異なる  │セッションファイルが同じ
  ──────────┼─────────────
  ブラウザ種別が異なる│セッションファイルが異なる
  使用PCが異なる      │セッションファイルが異なる

なお、ブラウザ(のウインドウ全て)を終了した場合、
クッキーの方がクリアされてしまうため、同じブラウザを再度起動しても
終了前のセッションは(セッションファイル自体はあるが無関係となってしまうので)
再度使うことはできない。
分類:PHP
SQL/MAX()について
2012年08月07日
MAX()のあれこれ(たぶんMIN()も同様だと思う)。

数値型でも文字型でもOK。
○SELECT MAX(1);     → 1
○SELECT MAX('a');   → a
○SELECT MAX(NULL);  → NULL

ワイルドカード(*)は一律使えないみたい。
○SELECT MAX(z) FROM (SELECT 1 AS z) AS a;
×SELECT MAX(*) FROM (SELECT 1 AS z) AS a;
上記の場合、単一列なのにエラーとなった。


判定する行がない場合は、NULLとなる。
○SELECT MAX(z) FROM (SELECT 1 AS z WHERE FALSE) AS a;  → NULL

判定する列が全てNULLだった場合には、NULLとなる。
○SELECT MAX(z) FROM (SELECT NULL::numeric AS z) AS a;  → NULL
分類:SQL
Smarty/文字の切り出し
2012年08月06日
Smartyで文字を部分的に抜き出す方法。

例えば、2文字目(ゼロオリジン)から4文字切り出すにはこう。
┌──────────────────────────────────────┐
│{$変数|substr:2:4}                                                          │
└──────────────────────────────────────┘

…リファレンスには載ってないような。。。

標準的なプラグインみたいですね。
分類:Smarty
JavaScript/例外情報
2012年08月04日
try-catchで捕捉できるエラーの一覧情報が欲しい………、でもない。
ということで、自分で作っていこう。
┌───────┬──────────────────────────────┐
│     name     │                          message                           │
├───────┼──────────────────────────────┤
│Error         │                                                            │
├───────┼──────────────────────────────┤
│EvalError     │                                                            │
├───────┼──────────────────────────────┤
│InternalError │                                                            │
├───────┼──────────────────────────────┤
│RangeError    │                                                            │
├───────┼──────────────────────────────┤
│ReferenceError│IE    :'■■'は定義されていません。                        │
│              │FF    :■■ is not defined                                 │
│              │Chrome:■■ is not defined                                 │
│              │Safari:Can't find variable: ■■                           │
│              │Opera :Undefined variable: ■■                            │
├───────┼──────────────────────────────┤
│StopIteration │                                                            │
├───────┼──────────────────────────────┤
│SyntaxError   │                                                            │
├───────┼──────────────────────────────┤
│TypeError     │IE    :'■■'はNullまたはオブジェクトではありません。      │
├───────┼──────────────────────────────┤
│URIError      │                                                            │
└───────┴──────────────────────────────┘
分類:JavaScript、【未解決】
JavaScript/エラーを握り潰す方法
2012年08月03日
try-catchで捕捉したら、throwしてあげれば闇へ葬り去ることができる。
┌──────────────────────────────────────┐
│try {                                                                       │
│    処理                                                                    │
│} catch (e) {                                                               │
│    if (e.name == 'ReferenceError') {                                       │
│        throw e;  // エラーを握り潰す                                       │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
ま、握り潰す対象は、エラー名称とかで絞り込んだ方がいいけどね(上記は一例)。

これによって、IEの左下に警告△アイコンが出なくなるよん。
分類:JavaScript
PostgreSQL/副問い合わせの数値と文字列
2012年08月02日
以下の構文は両方ともOK
○SELECT (SELECT 1);
○SELECT (SELECT 'A');

でも、以下の構文は後者がエラーとなる
○SELECT 'Z' WHERE 1 = (SELECT 1);
×SELECT 'Z' WHERE 'A' = (SELECT 'A');
なぜだろう?

一旦戻って、出力結果の型を調べた
○SELECT (SELECT 1)          →integer型
○SELECT (SELECT 'A')        →unknown型
文字列はunknown型になっちゃうみたい。

よって、以下のようにキャストしてあげればOK。
○SELECT 'Z' WHERE 'A' = (SELECT 'A')::text;
分類:PostgreSQL
SQL/副問い合わせ(3)
2012年08月01日
「単一行」副問い合わせは、対象とする表が複数行の表であっても
選択(SELECTの行数)によって、単一行となった場合には成立する。
  ○SELECT * FROM 単一行表
  ○SELECT * FROM 複数行表 WHERE 列 = 一意値
  ×SELECT * FROM 複数行表 WHERE 列 = 非一意値
これは実際のデータに左右されるので、やってみないとわからない。
(やった瞬間の状態に依存する)
例えば、ある列について、行1にのみ「A」という値が入っている場合に
その列に対して「A」を条件に抽出(選択)を行えば「単一行」副問い合わせが成立する。
しかし、直後に行2にも「A」という値を入れて再度SQL文を実行した場合、
今度は「単一行」副問い合わせが成立しなくなる。

ということで、「単一行」副問い合わせが成立するか否かは
事前に厳密に精査しておかねばならない。
基本的に(条件にNULLが絡まない限り)UNIQUE属性の列を
抽出条件の対象としておけば問題ないだろう。
分類:SQL
前へ 1 2 3 次へ