MW211 EXIT

devlog
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
SQL/副問い合わせ(2)
2012年07月31日
「単一列」副問い合わせは、対象とする表が複数列の表であっても
射影(SELECTの列数)によって、単一列になることが保証されれば成立する。
  ○SELECT 列 FROM 表
  ○SELECT * FROM 単一列表
  ×SELECT * FROM 複数列表
実際にデータがあろうがなかろうが理論上で単一列であることが決定できる。
分類:SQL
SQL/副問い合わせ(1)
2012年07月30日
副問い合わせはその結果により、以下の五種類に分類できる。
┌──────┬──────┬──────┐
│            │単一行単一列│単一行複数列│
│  該当なし  ├──────┼──────┤
│            │複数行単一列│複数行複数列│
└──────┴──────┴──────┘

副問い合わせが成立するのは以下の場合(○=成立、×=エラー)
【結果列に副問い合わせを出力する場合】
    ○SELECT (該当なし);  ※
    ○SELECT (単一行単一列);
    ×SELECT (複数行);
    ×SELECT (複数列);
  ※該当なしの場合は、NULL扱いとなる
    ちなみに型は該当ありだった場合の列の型となる
【条件式に副問い合わせを出力する場合】
    ○SELECT 列 FROM 表 WHERE 列 = (該当なし);  ※
    ○SELECT 列 FROM 表 WHERE 列 = (単一行単一列);
    ×SELECT 列 FROM 表 WHERE 列 = (複数行);
    ×SELECT 列 FROM 表 WHERE 列 = (複数列);
    ○SELECT 列 FROM 表 WHERE 列 IN (該当なし);  ※
    ○SELECT 列 FROM 表 WHERE 列 IN (単一列);
    ×SELECT 列 FROM 表 WHERE 列 IN (複数列);
  ※該当なしの場合はNULL扱いなので、条件式にNULLが混在することになり
    その結果、判定結果は「偽」になる
分類:SQL
SQL/NULLの法則
2012年07月29日
NULLは「''」や「0」と混同してしまいがちだが、
以下の性質があるので押さえておくと何かと役立つ。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
┌──────────────────────────────────────┐
│NULLが加減乗除の一要素となった場合、計算結果がNULLになる                    │
└──────────────────────────────────────┘
  なお、「1/NULL」のように除算しても除数ゼロエラーではなく計算結果がNULLとなる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
┌──────────────────────────────────────┐
│NULLに文字列結合した場合、結合結果がNULLになる                              │
└──────────────────────────────────────┘
  「NULL || 'a'」の結果は「'a'」ではなく「NULL」。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
┌──────────────────────────────────────┐
│NULLの型は不明型(unknown)だが、キャストもできる                             │
└──────────────────────────────────────┘
  「NULL::integer」のようにキャストするとその型(integer型)のNULLとなる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
┌──────────────────────────────────────┐
│NULLを判定するとたいてい偽になる                                            │
└──────────────────────────────────────┘
  ・CASE WHEN NULL = 0 THEN '真' ELSE '偽' END  →  偽
  ・CASE WHEN NULL > 0 THEN '真' ELSE '偽' END  →  偽
  ・CASE WHEN NULL < 0 THEN '真' ELSE '偽' END  →  偽
  加減乗除の結果もNULLとなるという法則を組み合わせると以下も導き出せる。
  ・CASE WHEN (NULL + 1) > 0 THEN '真' ELSE '偽' END  →  偽
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
┌──────────────────────────────────────┐
│NULLを判定するためには「IS NULL」を使わなければならない                     │
└──────────────────────────────────────┘
  「NULL IS NULL」は真だが、「NULL = NULL」は偽。
  ちなみに「NULL IS NOT NULL」は偽だが、「NULL <> NULL」も偽。
  さらには、「IN (NULL)」も「NOT IN (NULL)」も偽。
  NULLに対しては「IS NULL」や「IS NOT NULL」を使わないと一律に偽になる。
分類:SQL
Smarty/ゼロパディング
2012年07月28日
数値2桁(00)の場合は、以下のような感じ。
┌──────────────────────────────────────┐
│{$値|string_format:'%02d'}                                                  │
└──────────────────────────────────────┘
ま、printf()と要領は一緒やね。

サニタイズしたい時など、他の修飾子がある場合は、並べて書くだけ。
┌──────────────────────────────────────┐
│{$値|string_format:'%02d'|escape}                                           │
└──────────────────────────────────────┘
分類:Smarty
前へ 1 … 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 … 156 次へ