MW211 EXIT

devlog
SQL/優先順位台帳
2017年09月27日
優先順位を決めた優先順位台帳がある場合に、それを反映させる方法。
(干支を例とした優先順位台帳の場合)

優先順位順に並び替えるには、結合してあげればよい。
┌──────────────────────────────────────┐
│WITH 優先順位台帳 (                                                         │
│         順位,                                                              │
│         値                                                                 │
│     ) AS (                                                                 │
│          VALUES (1, '子'),                                                 │
│                 (2, '丑'),                                                 │
│                 (3, '寅')                                                  │
│     )                                                                      │
│SELECT 表.キー,                                                             │
│       優先順位台帳.順位,                                                   │
│       表.干支                                                              │
│    FROM 表                                                                 │
│        INNER JOIN 優先順位台帳                                             │
│          ON 優先順位台帳.値 = 表.干支                                      │
│    ORDER BY 表.キー           ASC,                                         │
│             優先順位台帳.順位 ASC;                                         │
└──────────────────────────────────────┘

グループ毎に最優先のものを洗い出すには、
一度結合して、最優先の順位を探して、さらに結合して
その最優先の順位の値をもってくる形になる。
┌──────────────────────────────────────┐
│WITH 優先順位台帳 (                                                         │
│         順位,                                                              │
│         値                                                                 │
│     ) AS (                                                                 │
│          VALUES (1, '子'),                                                 │
│                 (2, '丑'),                                                 │
│                 (3, '寅')                                                  │
│     )                                                                      │
│SELECT 別表.集合キー,                                                       │
│       優先順位台帳.値,                                                     │
│       優先順位台帳.順位 AS 干支                                            │
│    FROM (                                                                  │
│        SELECT 表.集合キー,                                                 │
│               MIN(優先順位台帳.順位) AS 順位                               │
│            FROM 表                                                         │
│                INNER JOIN 優先順位台帳                                     │
│                  ON 優先順位台帳.値 = 表.干支                              │
│            GROUP BY 表.集合キー                                            │
│    ) AS 別表                                                               │
│        INNER JOIN 優先順位台帳                                             │
│          ON 優先順位台帳.順位 = 別表.順位;                                 │
│    ORDER BY 表.キー ASC;                                                   │
└──────────────────────────────────────┘
これをCASE文にて(CASE文をネストさせて)以下のようにやってしまうこともできる。
┌──────────────────────────────────────┐
│SELECT 集合キー,                                                            │
│       CASE MIN(CASE 干支                                                   │
│                  WHEN '子' THEN 1                                          │
│                  WHEN '丑' THEN 2                                          │
│                  WHEN '寅' THEN 3                                          │
│                END)                                                        │
│         WHEN 1 THEN '子'                                                   │
│         WHEN 2 THEN '丑'                                                   │
│         WHEN 3 THEN '寅'                                                   │
│       END AS 干支                                                          │
│    FROM 表                                                                 │
│    WHERE 干支 IN ('子','丑','寅')                                          │
│    GROUP BY 集合キー                                                       │
│    ORDER BY 集合キー ASC;                                                  │
└──────────────────────────────────────┘
なお、いずれも想定外の値(優先順位台帳にない値)は無視する想定である。
分類:SQL
SQL/CASE文で更新したくない条件の場合
2017年09月26日
CASE文にて更新したくない条件の場合は、更新先の列を更新元にしてあげればよい。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 列 = 列;                                                            │
└──────────────────────────────────────┘
イメージ的には上記のような感じすれば、更新されない。

例えば、条件が偽の場合にのみNULLを設定する時は以下のような感じになる。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 列 = CASE                                                           │
│               WHEN 条件 THEN 列                                            │
│               ELSE           NULL                                          │
│             END;                                                           │
└──────────────────────────────────────┘
なお、トリガは起動してしまうので、更新差分があったかどうかのチェックを
加えてあげる必要がある。
分類:SQL
ExcelVBA/複合キーで取得
2017年09月25日
該当なしの場合は、Nullが返る。
┌──────────────────────────────────────┐
│'===============================================================================
│'  サブ関数:getBy複合キー
│'===============================================================================
│Private Function getBy複合キー(ByVal シート As Worksheet, _
│                               ByVal 第一キー As String, _
│                               ByVal 第二キー As String) As Variant
│    Const X第一キー As Long = 1
│    Const X第二キー As Long = 2
│    Const X取得値 As Long = 3
│    Const yMin As Long = 2
│    Dim yMax As Long
│    Dim obj検索 As Range, 検索範囲 As Range, 起点アドレス As String
│    Dim 検索キー As String
│    検索キー = 第一キー
│    検索キー = Replace(検索キー, "~", "~~")
│    検索キー = Replace(検索キー, "*", "~*")
│    検索キー = Replace(検索キー, "?", "~?")
│    With シート
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row
│        Set 検索範囲 = .Range(.Cells(yMin, X第一キー), .Cells(yMax, X第一キー))
│        Set obj検索 = 検索範囲.Find( _
│            What:=検索キー, _
│            After:=.Cells(yMin, X第一キー), _
│            LookIn:=xlValues, _
│            LookAt:=xlWhole, _
│            SearchOrder:=xlByRows, _
│            SearchDirection:=xlNext, _
│            MatchCase:=True, _
│            MatchByte:=True _
│        )
│        If obj検索 Is Nothing Then
│            getBy複合キー = Null
│            Exit Function
│        End If
│        起点アドレス = obj検索.Address
│        Do
│            If .Cells(obj検索.Row, X第二キー).Value = 第二キー Then
│                getBy複合キー = .Cells(obj検索.Row, X取得値).Value
│                Exit Function
│            End If
│            Set obj検索 = 検索範囲.FindNext(obj検索)
│        Loop Until obj検索.Address = 起点アドレス
│    End With
│    getBy複合キー = Null
│End Function
│'===============================================================================
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/複合キーで置換
2017年09月24日
┌──────────────────────────────────────┐
│'===============================================================================
│'  サブ関数:複合キーで置換
│'===============================================================================
│Private Sub 複合キーで置換(ByVal シート As Worksheet, _
│                           ByVal 第一キー As String, _
│                           ByVal 第二キー As String, _
│                           ByVal 置換値 As String)
│    Const X第一キー As Long = 1
│    Const X第二キー As Long = 2
│    Const X置換項目 As Long = 3
│    Const yMin As Long = 2
│    Dim yMax As Long
│    Dim obj検索 As Range, 検索範囲 As Range, 起点アドレス As String
│    Dim 検索キー As String
│    検索キー = 第一キー
│    検索キー = Replace(検索キー, "~", "~~")
│    検索キー = Replace(検索キー, "*", "~*")
│    検索キー = Replace(検索キー, "?", "~?")
│    With シート
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row
│        Set 検索範囲 = .Range(.Cells(yMin, X第一キー), .Cells(yMax, X第一キー))
│        Set obj検索 = 検索範囲.Find( _
│            What:=検索キー, _
│            After:=.Cells(yMin, X第一キー), _
│            LookIn:=xlValues, _
│            LookAt:=xlWhole, _
│            SearchOrder:=xlByRows, _
│            SearchDirection:=xlNext, _
│            MatchCase:=True, _
│            MatchByte:=True _
│        )
│        If obj検索 Is Nothing Then
│            Exit Sub
│        End If
│        起点アドレス = obj検索.Address
│        Do
│            If .Cells(obj検索.Row, X第二キー).Value = 第二キー Then
│                .Cells(obj検索.Row, X置換項目).Value = 置換値
│            End If
│            Set obj検索 = 検索範囲.FindNext(obj検索)
│        Loop Until obj検索.Address = 起点アドレス
│    End With
│End Sub
│'===============================================================================
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/純COUNTIF
2017年09月22日
通常のCOUNTIFではワイルドーカード(*や?)が効いてしまい
正しく算出されない場合用の関数。
┌──────────────────────────────────────┐
│'===========================================================================│
│'  内部関数:純COUNTIF                                                      │
│'===========================================================================│
│Private Function 純COUNTIF(ByVal 範囲 As Range, _                           │
│                           ByVal 検索文字 As String) As Long                │
│''''検索文字 = Replace(検索文字, "~", "~~")     ' COUNTIF系では不要         │
│    検索文字 = Replace(検索文字, "*", "~*")                                 │
│    検索文字 = Replace(検索文字, "?", "~?")                                 │
│    純COUNTIF = WorksheetFunction.CountIf(範囲, 検索文字)                   │
│End Function                                                                │
│'===========================================================================│
└──────────────────────────────────────┘
要は「~」を先頭につければ無効化できるという話。
分類:ExcelVBA
ExcelVBA/複合キー重複チェック関数
2017年09月21日
┌──────────────────────────────────────┐
│'===============================================================================
│'  サブ関数:is複合重複
│'===============================================================================
│Private Function is複合重複(ByVal シート As Worksheet, _
│                            ByVal 第一キー As String, _
│                            ByVal 第二キー As String) As Boolean
│    Const X第一キー As Long = 1
│    Const X第二キー As Long = 2
│    Const yMin As Long = 2
│    Dim yMax As Long
│    Dim obj検索 As Range, 検索範囲 As Range, 起点アドレス As String
│    Dim 検索キー As String
│    検索キー = 第一キー
│    検索キー = Replace(検索キー, "~", "~~")
│    検索キー = Replace(検索キー, "*", "~*")
│    検索キー = Replace(検索キー, "?", "~?")
│    With シート
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row
│        Set 検索範囲 = .Range(.Cells(yMin, X第一キー), .Cells(yMax, X第一キー))
│        Set obj検索 = 検索範囲.Find( _
│            What:=検索キー, _
│            After:=.Cells(yMin, X第一キー), _
│            LookIn:=xlValues, _
│            LookAt:=xlWhole, _
│            SearchOrder:=xlByRows, _
│            SearchDirection:=xlNext, _
│            MatchCase:=True, _
│            MatchByte:=True _
│        )
│        If obj検索 Is Nothing Then
│            is複合重複 = False
│            Exit Function
│        End If
│        起点アドレス = obj検索.Address
│        Do
│            If .Cells(obj検索.Row, X第二キー).Value = 第二キー Then
│                is複合重複 = True
│                Exit Function
│            End If
│            Set obj検索 = 検索範囲.FindNext(obj検索)
│        Loop Until obj検索.Address = 起点アドレス
│    End With
│    is複合重複 = False
│End Function
│'===============================================================================
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ゼロの判定
2017年09月20日
「= 0」で判定すると、空欄も真となるので注意。
┌─────┬───┬───┬───┐
│          │= ""  │= "0" │= 0   │
├───┬─┼───┼───┼───┤
│(不問)│  │  真  │  偽  │  真  │
├───┼─┼───┼───┼───┤
│文字列│' │  真  │  偽  │  偽  │
├───┼─┼───┼───┼───┤
│  数値│ 0│  偽  │  真  │  真  │
├───┼─┼───┼───┼───┤
│文字列│ 0│  偽  │  真  │  真  │
├───┼─┼───┼───┼───┤
│文字列│00│  偽  │  偽  │  真  │
├───┼─┼───┼───┼───┤
│  数値│ 1│  偽  │  偽  │  偽  │
├───┼─┼───┼───┼───┤
│文字列│a │  偽  │  偽  │  偽  │
└───┴─┴───┴───┴───┘
分類:ExcelVBA
ExcelVBA/行末尾に追加コピー
2017年09月12日
例えば、複写元シート(一行目は見出行なので除く)を
複写先シートの末尾(最終行の次の行)にコピペするのは、以下のような感じとなる。
┌──────────────────────────────────────┐
│Dim yMax As Long                                                            │
│With 複写元シート                                                           │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│    .Range(.Rows(2), .Rows(yMax)).Copy                                      │
│End With                                                                    │
│With 複写先シート                                                           │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│    .Rows(yMax + 1).PasteSpecial                                            │
│End With                                                                    │
│Application.CutCopyMode = False                                             │
└──────────────────────────────────────┘
分類:ExcelVBA
pgAdminのログ
2017年09月11日
以下で設定可能
ファイル>オプション>ロギング設定(タブ)>ログファイル(欄)
分類:PostgreSQL
正規表現/促音・長音
2017年09月04日
秀丸エディタの置換にて。

【促音】(右隣の文字に置換)
                            ┌───┬────┐
                            │置換前│(ッ)(.) │
                            ├───┼────┤
                            │置換後│\2\2    │
                            └┬──┴────┘
  ┌───┐      ┌───┐  │  ┌───┐
  │モット│──→│Moッto│─●→│Motto │
  └───┘      └───┘      └───┘

【長音】(左隣の文字に置換)
                            ┌───┬────┐
                            │置換前│(.)(ー) │
                            ├───┼────┤
                            │置換後│\1\1    │
                            └┬──┴────┘
  ┌───┐      ┌───┐  │  ┌───┐
  │サワー│──→│sawaー│─●→│sawaa │
  └───┘      └───┘      └───┘
分類:正規表現
前へ 1 次へ