MSSQL/文字列を除外した数値変換の罠
2021年03月02日
数値(実は文字列)と文字列が混在する列から、
数値だけをとりだすには、以下のように
数値以外を除外した上で、数値変換すればよいように思われる。
┌──────────────────────────────────────┐
│SELECT CONVERT([int], [列]) AS [列]                                         │
│    FROM (                                                                  │
│        VALUES ('1'),                                                       │
│               ('a')                                                        │
│    ) AS [表]([列])                                                         │
│    WHERE ISNUMERIC([列]) = 1;                                              │
└──────────────────────────────────────┘
確かに、これ単体だとうまくいく。

ところがこれをVIEWとかサブ表とかにすると、途端にエラーになる
┌──────────────────────────────────────┐
│SELECT [列]                                                                 │
│    FROM (                                                                  │
│        SELECT CONVERT([int], [列]) AS [列]                                 │
│            FROM (                                                          │
│                VALUES ('1'),                                               │
│                       ('a')                                                │
│            ) AS [表]([列])                                                 │
│            WHERE ISNUMERIC([列]) = 1                                       │
│    ) AS [表]                                                               │
│    WHERE [列] = 1;                                                         │
│//→メッセージ 245、レベル 16、状態 1、行 1                                 │
│//  varchar の値 'a' をデータ型 int に変換できませんでした。                │
└──────────────────────────────────────┘

以下のように列として仕分けしてあげないといけないようだ。
┌──────────────────────────────────────┐
│SELECT [列]                                                                 │
│    FROM (                                                                  │
│        SELECT CASE                                                         │
│                 WHEN ISNUMERIC([列]) = 1 THEN                              │
│                   CONVERT([int], [列])                                     │
│                 ELSE                                                       │
│                   NULL                                                     │
│               END AS [列]                                                  │
│            FROM (                                                          │
│                VALUES ('1'),                                               │
│                       ('a')                                                │
│            ) AS [表]([列])                                                 │
│    ) AS [表]                                                               │
│    WHERE [列] = 1;                                                         │
└──────────────────────────────────────┘
分類:MSSQL
jQuery/特定のクラスをスキップしてprevやnext
2021年02月22日
trタグでxクラスがある場合、それをスキップして次へ進む方法。

┌──────────────────────────────────────┐
│tr = tr.next('tr:not(.x)');                                                 │
└──────────────────────────────────────┘
これはダメ。次を一つだけ見て、条件一致するかを判定するだけだから。

以下のようにループさせるのがよい。
┌──────────────────────────────────────┐
│while (tr.next('tr').hasClass('x')) {                                       │
│    tr = tr.next('tr');                                                     │
│}                                                                           │
└──────────────────────────────────────┘
分類:jQuery
VBScript/連想二次元配列
2021年02月05日
キーの配下にスカラ配列がぶら下がるテーブルをクラスで実装した例。
┌──────────────────────────────────────┐
│Option Explicit                                                             │
│Dim objTable                                                                │
│Set objTable = New ClassTable                                               │
│Call objTable.Insert("尾張", "織田信長")                                    │
│Call objTable.Insert("尾張", "豊臣秀吉")                                    │
│Call objTable.Insert("三河", "徳川家康")                                    │
│Dim row, column                                                             │
│Set row = objTable.GetList("尾張")                                          │
│For Each column In row                                                      │
│    MsgBox column                                                           │
│Next                                                                        │
│Set row = objTable.GetList("三河")                                          │
│For Each column In row                                                      │
│    MsgBox column                                                           │
│Next                                                                        │
│WScript.Quit(0)                                                             │
│'***************************************************************************│
│'  クラス:連想二次元配列                                                   │
│'***************************************************************************│
│Class ClassTable                                                            │
│    Private mTable                                                          │
│    '=======================================================================│
│    '  コンストラクタ                                                       │
│    '=======================================================================│
│    Private Sub Class_Initialize                                            │
│        Set mTable = CreateObject("Scripting.Dictionary")                   │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  デストラクタ                                                         │
│    '=======================================================================│
│    Private Sub Class_Terminate                                             │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:追加                                                       │
│    '=======================================================================│
│    Public Sub Insert(inKey, inValue)                                       │
│        If Not mTable.Exists(inKey) Then                                    │
│            Set mTable(inKey) = CreateObject("System.Collections.ArrayList")│
│        End If                                                              │
│        Call mTable(inKey).Add(inValue)                                     │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:取得                                                       │
│    '=======================================================================│
│    Public Function GetList(inKey)                                          │
│        Set GetList = mTable(inKey)                                         │
│    End Function                                                            │
│    '=======================================================================│
│End Class                                                                   │
│'***************************************************************************│
└──────────────────────────────────────┘
分類:WSH・VBS
MSSQL/区切り文字で結合(横)
2021年01月20日
PHPのimplode()みたいに単純に文字列で結合する方法。
┌──────────────────────────────────────┐
│SELECT CONCAT_WS(',','A','B','C')                                           │
└──────────────────────────────────────┘
分類:MSSQL
WSH/まわりのファイルを検索
2021年01月18日
そのVBScriptファイルが存在するファイルのまわりのファイルを検索する雛形。
┌──────────────────────────────────────┐
│Dim objWSH:   Set objWSH = WScript.CreateObject("WScript.Shell")            │
│Dim objShell: Set objShell = WScript.CreateObject("Shell.Application")      │
│Dim objFSO:   Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
│Dim objFolder, objFile                                                      │
│Set objFolder = objFSO.GetFolder(objWSH.CurrentDirectory)                   │
│For Each objFile In objFolder.Files                                         │
│    If objFSO.GetFileName(objFile) <> WScript.ScriptName Then               │
│        MsgBox objFSO.GetFileName(objFile)         & vbCrLf & vbCrLf _      │
│             & vbCrLf _                                                     │
│             & objFile                             & vbCrLf & vbCrLf _      │
│             & objFSO.GetParentFolderName(objFile) & vbCrLf & vbCrLf _      │
│             & objFSO.GetBaseName(objFile)         & vbCrLf & vbCrLf _      │
│             & objFSO.GetExtensionName(objFile)                             │
│    End If                                                                  │
│Next                                                                        │
└──────────────────────────────────────┘
分類:WSH・VBS
jQueryUI/タブを画面いっぱいに
2021年01月08日
タブ(Tabs)を画面いっぱいに表示する方法。
┌──────────────────────────────────────┐
│$(this).tabs({heightStyle:'fill'});                                         │
└──────────────────────────────────────┘
親要素に合わせてサイズが調整される。

分類:jQuery
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
MSSQL/単純なCSV
2020年10月06日
一列をすべてCSVにする方法。
┌──────────────────────────────────────┐
│WITH [表] (                                                                 │
│         [列]                                                               │
│     ) AS (                                                                 │
│         SELECT [列]                                                        │
│             FROM (                                                         │
│                 VALUES ('A'),('B'),('C')                                   │
│             ) AS [表]([列])                                                │
│     )                                                                      │
│SELECT REPLACE((SELECT [表].[列] AS [data()]                                │
│                    FROM [表]                                               │
│                    FOR XML PATH ('')       ), ' ', ',') AS [列たち];       │
└──────────────────────────────────────┘
分類:MSSQL
PHP/RESTAPI的なことをしてみよう
2020年09月26日
jQuery側(JavaScript)の処理(抜粋)。
┌──┬───────────────────────────────────┐
│参照│$.ajax({                                                              │
│    │    url         :'htp://xxxx/api',                                    │
│    │    type        :'GET',                                               │
│    │    data        :JSONデータ,                                          │
├──┼───────────────────────────────────┤
│追加│$.ajax({                                                              │
│    │    url         :'htp://xxxx/api',                                    │
│    │    type        :'POST',                                              │
│    │    data        :JSONデータ,                                          │
├──┼───────────────────────────────────┤
│変更│$.ajax({                                                              │
│    │    url         :'htp://xxxx/api',                                    │
│    │    type        :'PUT',                                               │
│    │    data        :JSONデータ,                                          │
├──┼───────────────────────────────────┤
│削除│$.ajax({                                                              │
│    │    url         :'htp://xxxx/api',                                    │
│    │    type        :'DELETE',                                            │
│    │    data        :JSONデータ,                                          │
└──┴───────────────────────────────────┘

PHP側の処理例。
┌──────────────────────────────────────┐
│switch ($_SERVER['REQUEST_METHOD']) {                                       │
│    case 'GET':                                                             │
│        $data = $_GET;                                                      │
│        echo $this->select($data);                                          │
│        break                                                               │
│    case 'POST':                                                            │
│        $data = $_POST;                                                     │
│        $this->insert($data);                                               │
│        break                                                               │
│    case 'PUT':                                                             │
│        parse_str(urldecode(file_get_contents('php://input')), $data);      │
│        $this->update($data);                                               │
│        break                                                               │
│    case 'DELETE':                                                          │
│        parse_str(urldecode(file_get_contents('php://input')), $data);      │
│        $this->delete($data);                                               │
│        break                                                               │
│}                                                                           │
└──────────────────────────────────────┘
PUTメソッドとDELETEメソッドについては専用のシステム定数がないので
「php://input」からひっぱてくる形となる。
分類:PHP
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 150 次へ