MW211 EXIT

devlog
MSSQL/PDOとOracleリンクサーバと論理型
2020年11月30日
┌──────────────────────────────────────┐
│$sql = <<<___SQL___                                                         │
│SELECT [論理] FROM OPENQUERY(ORACLE, 'SELECT 0 AS "論理" FROM DUAL') AS [o] │
│___SQL___;                                                                  │
│$sth = PDO->prepare($sql);                                                  │
│$sth->execute();                                                            │
│$row = $sth->fetch(PDO::FETCH_ASSOC);                                       │
│if (!$row['論理']) {                                                        │
│    // 偽:偽のつもりで0を返却しているのでこちらを期待するのだが            │
│} else {                                                                    │
│    // 真:こちらになってしまう                                             │
│}                                                                           │
└──────────────────────────────────────┘
論理型はOracleでもMSSQLでも、「0」と「1」を用いるのが普通だ。
ところが、上記のようにPDOを用いて、リンクサーバ経由で
Oracleから偽のつもりで「0」を取得したら、PHP上では真となってしまった。

原因は以下の通り。
(1) PHPで数値型の「0」や「0.0」、文字列型の「0」は、偽(FALSE)扱いなのだが
    文字列型の「0.0」は真(TRUE)扱いとなってしまう
(2) PDOで値を取得すると、(基本的に)文字列型となる
(3) OPENQUERY()でOracleから0を取得すると、float型の「0.0」となってしまう
    整数ではなく小数のnumber型がOracleでは基本のため

よって、(2)と(3)の組み合わせにより、(1)の条件に適合してしまったようだ。

ということで、MSSQLの世界ではbit型で論理型の代用をするので
SQL(MSSQL)上で以下のように変換してから、PDOで読み込むのがよいようだ。
┌──────────────────────────────────────┐
│SELECT CONVERT([bit], [論理]) AS [論理]~                                   │
└──────────────────────────────────────┘
分類:PDO、MSSQL
Python/変換処理
2020年11月18日
┌──────────────────────────────────────┐
│switch (入力) {                                                             │
│    case "a": 出力 = "A";  break;                                           │
│    case "b": 出力 = "B";  break;                                           │
│    case "c": 出力 = "C";  break;                                           │
│    default : 出力 = 入力; break;                                           │
│}                                                                           │
└──────────────────────────────────────┘
上記のような処理をPythonで記述する場合、以下のようなif文にならざろうえない。
┌──────────────────────────────────────┐
│if 入力 == "a":                                                             │
│    出力 = "A"                                                              │
│elif 入力 == "b":                                                           │
│    出力 = "B"                                                              │
│elif 入力 == "c":                                                           │
│    出力 = "C"                                                              │
│else:                                                                       │
│    出力 = 入力                                                             │
└──────────────────────────────────────┘
これをスマートに記述するには連想配列を駆使するのがよいようだ。
┌──────────────────────────────────────┐
│aryConv = {                                                                 │
│    "a" :"A",                                                               │
│    "b" :"B",                                                               │
│    "c" :"C"                                                                │
│}                                                                           │
│if 入力 in aryConv:                                                         │
│    出力 = aryConv[入力]                                                    │
│else:                                                                       │
│    出力 = 入力                                                             │
└──────────────────────────────────────┘

必ず該当するのであれば以下もあり。
┌──────────────────────────────────────┐
│出力 = {                                                                    │
│    "a" :"A",                                                               │
│    "b" :"B",                                                               │
│    "c" :"C"                                                                │
│}.get(入力, 入力)                                                           │
└──────────────────────────────────────┘
分類:Python
前へ 1 次へ