PostgreSQL データベースにおける varchar、char、text の比較に関する簡単な説明

PostgreSQL データベースにおける varchar、char、text の比較に関する簡単な説明

以下のように表示されます。

名前説明する
文字可変(n)、varchar(n)長さ制限あり、可変長
文字(n)、char(n)固定長。長さが足りない場合は空欄を埋めてください。
文章可変長、長さ制限なし

つまり、varchar は可変長ですが、char は不変長です。postgresql データベースの場合、varchar と char の唯一の違いは、前者が可変長で、後者が固定長であることです。両方の最大長は 10485760 (1GB) です。

Varchar は長さを指定せず、最大長 (1GB) の文字列を保存できます。ただし、char は長さを指定せず、デフォルトは 1 です。この点には注意が必要です。

テキスト型: PostgreSQL データベースでは、テキストと varchar のパフォーマンスの違いはほとんどありません。唯一の違いはストレージ構造です。

文字列の長さが一定の場合は char を使用し、そうでない場合は varchar または text を使用する必要があります。

公式の解釈:

SQL では、character varying(n) と character(n) という 2 つの基本的な文字タイプが定義されています。ここで、n は正の整数です。どちらのタイプも、最大 n 文字の文字列 (バイトではない) を格納できます。これらのタイプのフィールドに長い文字列を保存しようとすると、余分な文字がすべて空白でない限りエラーが発生し、余分な文字がすべて空白の場合は文字列が最大長に切り捨てられます。この一見奇妙な例外は、SQL 標準によって要求されています。格納される文字列が宣言された長さより短い場合、文字型の値は空白で埋め込まれ、文字可変型の値は単に短い文字列を格納します。

値を明示的に文字 varying(n) または character(n) に変換すると、長すぎる値はエラーをスローせずに n 文字に切り捨てられます。これは SQL 標準の要件でもあります。

varchar(n) と char(n) はそれぞれ character varying(n) と character(n) の別名です。長さが宣言されていない文字は character(1) と同等です。長さ指定子なしで character varying を使用すると、この型は任意の長さの文字列を受け入れます。後者は PostgreSQL の拡張機能です。

さらに、PostgreSQL は任意の長さの文字列を格納できる text 型を提供します。テキスト型は SQL 標準の一部ではありませんが、他の多くの SQL データベース システムには存在します。

文字値は指定された長さ n まで物理的に空白が埋め込まれ、このように保存および表示されます。ただし、埋められた空白は意味的には無意味です。 2 つの文字値を比較する場合、パディングスペースは無視されます。他の文字列型に変換する場合、文字値内のスペースは削除されます。文字可変値とテキスト値では、末尾の空白は意味を持つことに注意してください。また、LIKE などのパターン マッチングを使用する場合は、正規表現を使用します。

短い文字列 (最大 126 バイト) のストレージ要件は、スペース パディング文字を含む実際の文字列に 1 バイトを加えたものです。長い文字列には、1 バイトではなく 4 バイトのオーバーヘッドがあります。長い文字列はシステムによって自動的に圧縮されるため、ディスク上の物理的な要件が小さくなる可能性があります。長い値もバックエンド テーブルに保存されるため、短いフィールド値への高速アクセスを妨げません。いずれにしても、保存できる最長の文字列は約 1 GB です。データ型宣言に出現できる n の最大値はこれよりも小さくなります。マルチバイトエンコーディングでは文字数とバイト数が大きく異なる可能性があるため、この動作を変更してもあまり意味がありません。特定の上限のない長い文字列を保存する場合は、任意の長さ制限を選択するのではなく、長さ宣言なしでテキストまたは文字可変を使用します。

ヒント: 空白が埋め込まれたタイプを使用する場合のストレージ スペースの増加と、長さが制約された列を格納するときにストレージの長さをチェックするための追加の CPU サイクルを除いて、3 つのタイプ間にパフォーマンスの違いはありません。他のデータベース システムでは、character(n) に一定のパフォーマンス上の利点がありますが、PostgreSQL ではそうではありません。実際、character(n) は追加のストレージ コストがかかるため、通常 3 つの中で最も遅くなります。ほとんどの場合、テキストまたは文字の変化を使用する必要があります。

補足: テキスト入力とテキスト検索にはPostGreSQLデータベースを使用する

中国語の単語分割

中国語パース.cs

システムの使用;
System.Collections を使用します。
System.IO を使用します。
System.Text.RegularExpressions を使用します。
名前空間 FullTextSearch.Common
{
  /// <要約>
  /// 中国語の単語分割器。
  /// </要約>
  パブリッククラス ChineseParse
  {
    プライベート静的読み取り専用 ChineseWordsHashCountSet _countTable;
    静的ChineseParse()
    {
      _countTable = 新しい ChineseWordsHashCountSet();
      InitFromFile("ChineseDictionary.txt");
    }
    /// <要約>
    /// 指定されたファイルから中国語の単語辞書と文字列頻度辞書を初期化します。
    /// </要約>
    /// <param name="fileName">ファイル名</param>
    プライベート静的 void InitFromFile(文字列ファイル名)
    {
      文字列パス = Path.Combine(Directory.GetCurrentDirectory(), @"..\..\Common\", fileName);
      if (File.Exists(パス))
      {
        (StreamReader sr = File.OpenText(path)) を使用します
        {
          文字列 s = "";
          ((s = sr.ReadLine()) != null) の場合
          {
            ChineseWordUnit _tempUnit = InitUnit(s);
            _countTable.InsertWord(_tempUnit.Word);
          }
        }
      }
    }
    /// <要約>
    /// 文字列を ChineseWordUnit に解析します。
    /// </要約>
    /// <param name="s">文字列</param>
    /// <returns>解析された ChineseWordUnit</returns>
    /// 4
    /// 0
    プライベート静的ChineseWordUnit InitUnit(文字列 s)
    {
      var reg = new Regex(@"\s+");
      文字列[] temp = reg.Split(s);
      //if (temp.Length != 2)
      //{
      // 新しい例外をスローします("文字列解析エラー: " + s);
      //
      (temp.長さ!= 1)の場合
      {
        throw new Exception("文字列解析エラー: " + s);
      }
      新しいChineseWordUnit(temp[0], Int32.Parse("1"))を返します。
    }
    /// <要約>
    /// 入力文字列を分析し、個々の単語に分割します。
    /// </要約>
    /// <param name="s">切り取る文字列</param>
    /// <returns>切り取って得られた中国語の単語配列</returns>
    パブリック静的文字列[] ParseChinese(文字列 s)
    {
      int _length = s.Length;
      文字列 _temp = String.Empty;
      var _words = 新しいArrayList();
      (int i = 0; i < s.Length;) の場合
      {
        _temp = s.Substring(i, 1);
        _countTable.GetCount(_temp) > 1 の場合
        {
          整数j = 2;
          (; i + j < s.Length + 1 && _countTable.GetCount(s.Substring(i, j)) > 0; j++) の場合
          {
          }
          _temp = s.Substring(i, j - 1);
          i = i + j - 2;
        }
        私は++;
        _words.Add(_temp);
      }
      var _tempStringArray = 新しい文字列[_words.Count];
      _words.CopyTo(_tempStringArray);
      _tempStringArray を返します。
    }
  }
}

中国語単語ハッシュカウントセット.cs

System.Collections を使用します。
名前空間 FullTextSearch.Common
{
  /// <要約>
  /// 中国語辞書に収録されている中国語の単語の先頭に文字列が出現する回数を記録する辞書クラス。 「中国」の先頭に「中」という文字列が出現した場合、その回数を辞書に記録します。
  /// </要約>
  パブリッククラス ChineseWordsHashCountSet
  {
    /// <要約>
    /// 中国語の単語に文字列が出現する回数を記録するハッシュテーブル。キーは特定の文字列であり、値は中国語の単語に文字列が出現する回数です。
    /// </要約>
    プライベート読み取り専用ハッシュテーブル _rootTable;
    /// <要約>
    /// 型の初期化。
    /// </要約>
    パブリック ChineseWordsHashCountSet()
    {
      _rootTable = 新しいハッシュテーブル();
    }
    /// <要約>
    /// 中国語辞書に記録されている中国語の単語の先頭に指定された文字列が出現する回数を照会します。
    /// </要約>
    /// <param name="s">文字列を指定</param>
    /// <returns>中国語辞書に記録されている中国語の単語の先頭に文字列が出現する回数。 -1 の場合は表示されないことを意味します。 </戻り値>
    パブリック int GetCount(文字列 s)
    {
      if (!_rootTable.ContainsKey(s.Length))
      {
        -1 を返します。
      }
      var _tempTable = (ハッシュテーブル) _rootTable[s.Length];
      if (!_tempTable.ContainsKey(s))
      {
        -1 を返します。
      }
      (int) _tempTable[s]を返します。
    }
    /// <要約>
    /// 頻度辞書に単語を挿入します。単語を解析し、頻度辞書に挿入します。
    /// </要約>
    /// <param name="s">処理する文字列。 </パラメータ>
    パブリック void InsertWord(文字列 s)
    {
      (int i = 0; i < s.Length; i++) の場合
      {
        文字列 _s = s.Substring(0, i + 1);
        サブ文字列を挿入します(_s);
      }
    }
    /// <要約>
    /// 文字列カウントレコードをカウント辞書に挿入します。
    /// </要約>
    /// <param name="s">挿入する文字列。 </パラメータ>
    プライベート void InsertSubString(文字列 s)
    {
      if (!_rootTable.ContainsKey(s.Length) && s.Length > 0)
      {
        var _newHashtable = 新しいハッシュテーブル();
        _rootTable.Add(s.Length, _newHashtable);
      }
      var _tempTable = (ハッシュテーブル) _rootTable[s.Length];
      if (!_tempTable.ContainsKey(s))
      {
        _tempTable.Add(s, 1);
      }
      それ以外
      {
        _tempTable[s] = (int) _tempTable[s] + 1;
      }
    }
  }
}

中国語単語単位.cs

名前空間 FullTextSearch.Common
{
  パブリック構造体 ChineseWordUnit
  {
    プライベート読み取り専用int _power;
    プライベート読み取り専用文字列 _word;
    /// <要約>
    /// 構造体の初期化。
    /// </要約>
    /// <param name="word">中国語の単語</param>
    /// <param name="power">単語の重み</param>
    パブリック ChineseWordUnit(文字列 word, int べき乗)
    {
      _word = 単語;
      _power = パワー;
    }
    /// <要約>
    /// 中国語の単語単位に対応する中国語の単語。
    /// </要約>
    公開文字列 単語
    {
      取得 { _word を返す; }
    }
    /// <要約>
    /// 中国語の単語の重み。
    /// </要約>
    パブリック int パワー
    {
      取得 { _power を返す; }
    }
  }
}

中国語辞書.txt

メインウィンドウインターフェース

メインマネージャー.cs

システムの使用;
System.Collections.Generic を使用します。
System.Data を使用します。
System.Drawing を使用します。
System.Windows.Forms を使用します。
FullTextSearch.Common を使用します。
Npgsql を使用します。
名前空間 FullTextSearch
{
  パブリック部分クラス MainManager: Form
  {
    プライベート読み取り専用 PostgreSQL pg = new PostgreSQL();
    プライベート読み取り専用 SQLquerys sqlQuerys = new SQLquerys();
    プライベート char analysisType;
    プライベート文字列createConnString = "";
    プライベートデータセットdataSet = new DataSet();
    プライベート DataTable dataTable = new DataTable();
    プライベート char odabirAndOr;
    プライベート char vrstaPretrazivanja;
    パブリック MainManager()
    {
      コンポーネントを初期化します。
      rbtn_AND.Checked = true;
      rbtnNeizmjenjeni.Checked = true;
      odabirAndOr = '*';
      ラジオボタン_Day.Checked = true;
      ラジオボタン_Day.Checked = true;
    }
    プライベート void Form1_Load(オブジェクト送信者、EventArgs e)
    {
      gb_unosPodataka.Enabled = false;
      groupBox_Search.Enabled = false;
      groupBox_Analysis.Enabled = false;
      button_Disconnect.Enabled = false;
      ボタン_Pretrazi.BackColor = Color.WhiteSmoke;
      button_Disconnect.BackColor = Color.WhiteSmoke;
      button_unosTekstaUBazu.BackColor = Color.WhiteSmoke;
      ボタン1のBackColor = Color.WhiteSmoke;
    }
    プライベート void button_unosTekstaUBazu_Click(オブジェクト送信者、EventArgs e)
    {
      文字列 searchTextBoxString = rTB_unosTextaUBazu.Text;
      if (searchTextBoxString != "")
      {
        pg.insertIntoTable(検索テキストボックス文字列、pg.conn);
        MessageBox.Show(searchTextBoxString + "データベースに追加!");
        rTB_unosTextaUBazu.Clear();
      }
      それ以外
      {
        MessageBox.Show("空のデータは許可されません!");
      }
    }
    プライベート void button_Pretrazi_Click(オブジェクト送信者、EventArgs e)
    {
      文字列 stringToSearch;
      文字列 sql;
      文字列のハイライトテキスト;
      文字列のランク;
      文字列チェック;
      文字列を検索 = txt_Search.Text.Trim();
      var list = new List<文字列>(ChineseParse.ParseChinese(stringToSearch));
      ;
      sql = sqlQuerys.createSqlString(list, odabirAndOr, vrstaPretrazivanja);
      リッチテキストボックス1.テキスト = sql;
      チェック = sqlQuerys.testIfEmpty(stringToSearch);
      pg.insertIntoAnalysisTable(文字列を検索対象として、pg.conn);
      pg.openConnection();
      var command = new NpgsqlCommand(sql, pg.conn);
      NpgsqlDataReader リーダー = command.ExecuteReader();
      整数カウント = 0;
      linkLabel_Rezultat.Text = " ";
      (reader.Read()) の間
      {
        ハイライトされたテキスト = reader[1].ToString();
        ランク = リーダー[3].ToString();
        linkLabel_Rezultat.Text += highlitedText + "[" + rank + "]\n";
        カウント++;
      }
      labelBrojac.Text = "見つかったファイルの数: " + count;
      pg.closeConnection();
    }
    プライベート void rbtn_AND_CheckedChanged(オブジェクト送信者、EventArgs e)
    {
      odabirAndOr = '*';
    }
    プライベート void rbtn_OR_CheckedChanged(オブジェクト送信者、EventArgs e)
    {
      odabirAndOr = '+';
    }
    プライベート void rbtnNeizmjenjeni_CheckedChanged(オブジェクト送信者、EventArgs e)
    {
      条件 = 'A';
    }
    プライベート void rbtn_Rijecnici_CheckedChanged(オブジェクト送信者、EventArgs e)
    {
      条件 = 'B';
    }
    プライベート void rbtn_Fuzzy_CheckedChanged(オブジェクト送信者、EventArgs e)
    {
      パラメータ = 'C';
    }
    プライベート void button_Connect_Click(オブジェクト送信者、EventArgs e)
    {
      (connectMe()) の場合
      {
        gb_unosPodataka.Enabled = true;
        グループボックス検索を有効にするには、true に設定します。
        groupBox_Analysis.Enabled = true;
        textBox_Database.Enabled = false;
        textBox_IP.Enabled = false;
        textBox_Port.Enabled = false;
        textBox_Password.Enabled = false;
        textBox_UserID.Enabled = false;
        button_Connect.Enabled = false;
        button_Disconnect.Enabled = true;
        button_Pretrazi.BackColor = Color.SkyBlue;
        button_Disconnect.BackColor = Color.IndianRed;
        button_unosTekstaUBazu.BackColor = Color.MediumSeaGreen;
        button1.BackColor = Color.MediumSeaGreen;
        button_Connect.BackColor = Color.WhiteSmoke;
      }
    }
    プライベート void button_Disconnect_Click(オブジェクト送信者、EventArgs e)
    {
      gb_unosPodataka.Enabled = false;
      groupBox_Search.Enabled = false;
      groupBox_Analysis.Enabled = false;
      textBox_Database.Enabled = true;
      textBox_IP.Enabled = true;
      textBox_Port.Enabled = true;
      textBox_Password.Enabled = true;
      textBox_UserID.Enabled = true;
      ボタン_Connect.Enabled = true;
      button_Disconnect.Enabled = false;
      ボタン_Pretrazi.BackColor = Color.WhiteSmoke;
      button_Disconnect.BackColor = Color.WhiteSmoke;
      button_unosTekstaUBazu.BackColor = Color.WhiteSmoke;
      ボタン1のBackColor = Color.WhiteSmoke;
      button_Connect.BackColor = Color.MediumSeaGreen;
      txt_Search.Text = "";
      linkLabel_Rezultat.Text = "";
      リッチテキストボックス1.テキスト = "";
      labelBrojac.Text = "";
    }
    プライベートブール connectMe()
    {
      createConnString += "サーバー=" + textBox_IP.Text + ";ポート=" + textBox_Port.Text + ";ユーザーID=" +
                textBox_UserID.Text + ";パスワード=" + textBox_Password.Text + ";データベース=" +
                textBox_Database.Text + ";";
      sqlQuerys.setTheKey(ConnString を作成します);
      pg.setConnectionString();
      pg.setConnection();
      (pg.openConnection() の場合)
      {
        MessageBox.Show("正常に接続されました!");
        pg.closeConnection();
        true を返します。
      }
      false を返します。
    }
    プライベート void button1_Click(オブジェクト送信者、EventArgs e)
    {
      文字列 selectedTimestamp;
      selectedTimestamp = dateTimePicker_From.Value.ToString("dd-MM-yyyy hh:mm:ss") + " " +
                dateTimePicker_To.Value.ToString("dd-MM-yyyy hh:mm:ss");
      var analize = new Analysis(selectedTimestamp, analysisType);
      分析します。表示();
    }
    プライベート void radioButton_Day_CheckedChanged(オブジェクト送信者、EventArgs e)
    {
      分析タイプ = 'D';
    }
    プライベート void radioButton_Hour_CheckedChanged(オブジェクト送信者、EventArgs e)
    {
      分析タイプ = 'H';
    }
  }
}

SQLquerys.cs コード:

System.Collections.Generic を使用します。
名前空間 FullTextSearch
{
  内部クラス SQLquerys
  {
    プライベート静的文字列 giveMeTheKey;
    プライベート静的int tempInt = 1;
    //接続文字列を設定する public void setTheKey(string connString)
    {
      giveMeTheKey = connString;
      giveMeTheKey += "";
    }
    //接続文字列を静的変数に保存する public string getTheKey()
    {
      giveMeTheKey += "";
      giveMeTheKey を返します。
    }
    パブリック void setCounter()
    {
      tempInt = 1;
    }
    //ANDとORの選択に基づいて検索用の文字列を分析します public string createFunctionString(List<string> searchList, char selector)
    {
      文字列 TempString = "";
      文字列[] TempField = null;
      整数 i = 0;
      整数j = 0;
      foreach (searchList 内の文字列 searchStringInList)
      {
        (j != 0) の場合
        {
          if (セレクタ == '+')
            TempString = TempString + " | ";
          そうでない場合 (セレクタ == '*')
            TempString = TempString + " & ";
        }
        1 = 1;
        TempField = splitListForInput(検索文字列リスト内);
        一時文字列 = 一時文字列 + "(";
        foreach (TempField 内の文字列 justTempString)
        {
          (i != 0) の場合
          {
            TempString = TempString + " & ";
          }
          TempString = TempString + justTempString;
          私 = 1;
        }
        TempString = TempString + ")";
        私 = 0;
      }
      TempString を返します。
    }
    //ヘルパーメソッド public List<string> splitInputField(string[] inputField)
    {
      var unfinishedList = 新しい List<string>();
      foreach (inputField 内の文字列 splitString)
      {
        未完成リストを追加します(splitString);
      }
      未完了リストを返します。
    }
    //ヘルパーメソッド public string[] splitListForInput(string inputString)
    {
      文字列[] 解析されたリスト = null;
      解析されたリスト = inputString.Split(' ');
      解析されたリストを返します。
    }
    // PostgreSQL で辞書検索用の ts 関数を作成する関数 public string createTsFunction(string tsString)
    {
      文字列 tsHeadline = "";
      文字列 tsRank = "";
      文字列 tsFunction = "";
      tsHeadline = ",\n ts_headline(\"content\", to_tsquery('" + tsString + "')), \"content\"";
      tsRank = ",\n ts_rank(to_tsvector(\"content\"), to_tsquery('" + tsString + "')) ランク";
      tsFunction = tsHeadline + tsRank;
      tsFunction を返します。
    }
    //SQL クエリの作成は、選択された検索の種類と AND または OR セレクターに依存します。public string createSqlString(List<string> searchList, char selector, char vrstaPretrazivanja)
    {
      文字列 selectString = "";
      文字列 myTempString = "";
      文字列 TempString = "";
      整数 i = 0;
      TempString = createFunctionString(検索リスト、セレクター);
      TempString を作成します。
      selectString = "SELECT \"id\"" + TempString + "\nFROM \"texttable\" \nWHERE ";
      if (vrstaPretrazivanja == 'A')
      {
        foreach (searchList 内の文字列 myString)
        {
          (i == 0)の場合
          {
            myTempString = myTempString + "\"content\" LIKE '%" + myString + "%' ";
            私は++;
          }
          それ以外
          {
            if (セレクタ == '*')
              myTempString = myTempString + "\nAND \"content\" LIKE '%" + myString + "%' ";
            そうでない場合 (セレクタ == '+')
              myTempString = myTempString + "\nまたは \"content\" LIKE '%" + myString + "%' ";
          }
        }
      }
      そうでない場合 (vrstaPretrazivanja == 'B')
      {
        foreach (searchList 内の文字列 myString)
        {
          文字列 temporalString = "";
          文字列[] テスト文字列 = myString.Split(' ');
          (int k = 0; k < testingString.Length; k++) の場合
          {
            if (k != テスト文字列の長さ - 1)
            {
              temporalString += テスト文字列[k] + " & ";
            }
            それ以外
            {
              temporalString += テスト文字列[k];
            }
          }
          (i == 0)の場合
          {
            myTempString = myTempString + "to_tsvector(\"content\") @@ to_tsquery('english', '" +
                    temporalString + "')";
            私は++;
          }
          それ以外
          {
            if (セレクタ == '*')
              myTempString = myTempString + "\nAND to_tsvector(\"content\") @@ to_tsquery('english', '" +
                      temporalString + "')";
            そうでない場合 (セレクタ == '+')
              myTempString = myTempString + "\nまたは to_tsvector(\"content\") @@ to_tsquery('english', '" +
                      temporalString + "')";
          }
        }
      }
      if (vrstaPretrazivanja == 'C')
      {
        foreach (searchList 内の文字列 myString)
        {
          (i == 0)の場合
          {
            myTempString = myTempString + "\"content\" % '" + myString + "' ";
            私は++;
          }
          それ以外
          {
            if (セレクタ == '*')
              myTempString = myTempString + "\nAND \"content\" % '" + myString + "' ";
            そうでない場合 (セレクタ == '+')
              myTempString = myTempString + "\nまたは \"content\" % '" + myString + "' ";
          }
        }
      }
      selectString = selectString + myTempString + "\nORDER BY rank DESC";
      selectString を返します。
    }
    公開文字列 testIfEmpty(文字列 searchedText)
    {
      文字列 checkingIfEmpty = "SELECT * FROM \"analysisTable\" WHERE \"searchedtext\" =' " + searchedText + "'";
      空の場合チェックを返す;
    }
    パブリック文字列 queryForAnalysis(char analysisChoice)
    {
      文字列 myTestsql = "";
      if (分析選択 == 'H')
      {
        // このクエリはテスト目的でこのように記述されているため、変更する必要があります。myTestsql = "SELECT * FROM crosstab('SELECT CAST((\"searchedtext\") AS text) searchedText,"
              +
              " CAST(EXTRACT(HOUR FROM \"timeOfSearch\") AS int) AS sat、CAST(COUNT(*) AS int) AS broj FROM \"analysisTable\" GROUP BY \"searchedText\", sat"
              +
              " ORDER BY \"searchedtext\", sat', 'SELECT rbrSata FROM sat ORDER BY rbrSata') AS pivotTable (\"searchedText\" TEXT, t0_1 INT, t1_2 INT"
              +
              "、t2_3 INT、t3_4 INT、t4_5 INT、t5_6 INT、t6_7 INT、t7_8 INT、t8_9 INT、t9_10 INT、t10_11 INT、t11_12 INT、t12_13 INT"
              +
              "、t13_14 INT、t14_15 INT、t15_16 INT、t16_17 INT、t17_18 INT、t18_19 INT、t19_20 INT、t20_21 INT、t21_22 INT、t22_23 INT、t23_00 INT) ORDER BY \"searchedText\"";
        myTestsql を返します。
      }
      if (分析選択肢 == 'D')
      {
        // このクエリはテスト目的のためだけにこのように書かれていますが、変更する必要があります。myTestsql += "SELECT *FROM crosstab ('SELECT CAST((\"searchedtext\") AS text) AS searchedText, CAST(EXTRACT(DAY FROM \"dateOfSearch\") AS int) AS dan"
               + "、CAST(COUNT(*) AS int) AS broj FROM \"analysisTable\" GROUP BY \"searchedText\", "
               +
               "dan ORDER BY \"searchedtext\", dan', 'SELECT rbrDana FROM dan ORDER BY rbrDana') AS pivotTable(\"searchedtext\" TEXT";
        myTestsql を返します。
      }
      myTestsql を返します。
    }
    //このメソッドは日付を解析するために使用されます public int[] parseForDates(string date)
    {
      文字列[] 温度;
      var tempInt = 新しいint[3];
      temp = date.Split('-');
      (int i = 0; i < 3; i++) の場合
      {
        tempInt[i] = int.Parse(temp[i]);
      }
      tempInt を返します。
    }
    // このコードは分析を作成するために使用され、選択した日付/時刻の分析を作成できるように日付/時刻の操作を行います。
    パブリック文字列 createSqlForDayAnalysis(文字列 dateFrom、文字列 dateTo)
    {
      文字列 insertIntoTempTable = "";
      文字列 dateTimeForAnalysis = "";
      int[] tempFrom = parseForDates(dateFrom);
      int[] tempTo = parseForDates(dateTo);
      //月変更アルゴリズム while (tempFrom[0] != tempTo[0] || tempFrom[1] != tempTo[1])
      {
        (tempFrom[1] == tempTo[1])の場合
        {
          (tempFrom[0] != tempTo[0]) の場合
          {
            (int i = tempInt + 1; tempFrom[0] + 2 < tempTo[0] + 2; i++) の場合
            {
              insertIntoTempTable += "INSERT INTO \"dan\" VALUES (" + i + ");";
              dateTimeForAnalysis += ",dd" + tempFrom[0] + tempFrom[1] + tempFrom[2] + " INT";
              tempInt = i;
              tempFrom[0]++;
            }
          }
        }
        (tempFrom[1] != tempTo[1])の場合
        {
          (tempFrom[1]%2 == 0 || tempFrom[1] == 7 || tempFrom[1] == 1)の場合
          {
            (int i = tempInt; tempFrom[0] < 31 && tempFrom[1] != tempTo[1]; i++) の場合
            {
              insertIntoTempTable += "INSERT INTO \"dan\" VALUES (" + i + ");";
              dateTimeForAnalysis += ", dd" + tempFrom[0] + tempFrom[1] + tempFrom[2] + " INT";
              tempInt = i;
              tempFrom[0]++;
              (tempFrom[0] == 31)の場合
              {
                temp[1]++から;
                tempFrom[0] = 1;
              }
            }
          }
        }
      }
      dateTimeForAnalysis += ") ORDER BY \"searchedtext\"";
      dateTimeForAnalysis + "#" + insertIntoTempTable を返します。
    }
  }
}

PostgreSQL.cs コード:

システムの使用;
System.Windows.Forms を使用します。
Npgsql を使用します。
NpgsqlTypes を使用します。
名前空間 FullTextSearch
{
  パブリッククラス PostgreSQL
  {
    プライベート静的int tempInt = 1;
    プライベート読み取り専用 SQLquerys sql = new SQLquerys();
    パブリック NpgsqlConnection 接続;
    パブリック文字列接続文字列;
    プライベート文字列 newConnString;
    パブリックPostgreSQL()
    {
      接続文字列を設定します。
      接続を設定します。
    }
    パブリック void setConnectionString()
    {
      新しいConnString = sql.getTheKey();
      接続文字列 = String.Format(newConnString);
      接続を設定します。
    }
    パブリック void setConnection()
    {
      conn = 新しい NpgsqlConnection(接続文字列);
    }
    パブリックブール openConnection()
    {
      試す
      {
        接続を開きます。
        true を返します。
      }
      キャッチ
      {
        MessageBox.Show("接続できません! パラメータを確認してください!");
        false を返します。
      }
    }
    パブリック void closeConnection()
    {
      接続を閉じる();
    }
    パブリック void insertIntoTable(文字列 textToInsert、NpgsqlConnection nsqlConn)
    {
      文字列 mySqlString = "\"texttable\" (\"content\") 値 (@Param1) に INSERT INTO";
      var myParameter = new NpgsqlParameter("@Param1", NpgsqlDbType.Text);
      myParameter.Value = textToInsert;
      オープン接続();
      var myCommand = new NpgsqlCommand(mySqlString, nsqlConn);
      myCommand.Parameters.Add(myParameter);
      myCommand.ExecuteNonQuery();
      接続を閉じる();
    }
    パブリック void insertIntoAnalysisTable(文字列 textToInsert、NpgsqlConnection nsqlConn)
    {
      文字列 dateTime = DateTime.Now.ToString();
      文字列[] 温度;
      temp = dateTime.Split(' ');
      文字列 mySqlString =
        "INSERT INTO \"analysistable\" (\"searchedtext\", \"dateofsearch\", \"timeofsearch\") VALUES ('" +
        textToInsert + "', '" + temp[0] + "'" + ", '" + temp[1] + "');";
      オープン接続();
      var myCommand = new NpgsqlCommand(mySqlString, nsqlConn);
      myCommand.ExecuteNonQuery();
      接続を閉じる();
    }
    パブリック void executeQuery(文字列 queryText、NpgsqlConnection nsqlConn)
    {
      オープン接続();
      var myCommand = new NpgsqlCommand(queryText, nsqlConn);
      myCommand.ExecuteNonQuery();
      接続を閉じる();
    }
    パブリック void createTempTable(NpgsqlConnection nsqlConn、char analysisType、string dateFrom、string dateTo、
      文字列splitMe)
    {
      分析タイプ == 'H' の場合
      {
        文字列 dropIfExists = "存在する場合はテーブルを削除 \"sat\";";
        string createTempTable = "テーブルが存在しない場合は \"sat\" (rbrSata INT);";
        文字列 insertIntoTempTable = "";
        (int i = 0; i < 24; i++) の場合
        {
          insertIntoTempTable += "INSERT INTO \"sat\" VALUES (" + i + ");";
        }
        オープン接続();
        var commandDrop = new NpgsqlCommand(dropIfExists, nsqlConn);
        コマンドドロップ。非クエリを実行します。
        var commandCreate = new NpgsqlCommand(createTempTable, nsqlConn);
        コマンド作成。ExecuteNonQuery();
        var commandInsert = new NpgsqlCommand(insertIntoTempTable, nsqlConn);
        コマンド挿入.ExecuteNonQuery();
        接続を閉じる();
      }
      そうでない場合 (分析タイプ == 'D')
      {
        文字列 dropIfExists = "存在する場合はテーブルを削除 \"dan\";";
        string createTempTable = "テーブルが存在しない場合は \"dan\" (rbrDana INT); を作成します";
        文字列 insertIntoTempTable = splitMe;
        オープン接続();
        var commandDrop = new NpgsqlCommand(dropIfExists, nsqlConn);
        コマンドドロップ。非クエリを実行します。
        var commandCreate = new NpgsqlCommand(createTempTable, nsqlConn);
        コマンド作成。ExecuteNonQuery();
        var commandInsert = new NpgsqlCommand(insertIntoTempTable, nsqlConn);
        コマンド挿入.ExecuteNonQuery();
        接続を閉じる();
      }
    }
  }
}

PostGreSQL SQL スクリプト:

CREATE TABLE public.analysistable
(
  id 整数 NOT NULL デフォルト nextval('analysistable_id_seq'::regclass),
  検索テキスト テキスト COLLATE pg_catalog."default" NOT NULL,
  dateofsearch 日付が NULL ではない、
  timeofsearch タイムゾーンなしの時刻 NOT NULL、
  制約 analysistable_pkey 主キー (id)
)
と (
  OID = 偽
)
テーブルスペース pg_default;
ALTER TABLE public.analysistable
  所有者から王へ;
テーブル public.texttable を作成する
(
  id 整数 NOT NULL デフォルト nextval('texttable_id_seq'::regclass),
  コンテンツテキスト COLLATE pg_catalog."default" NOT NULL,
  制約 texttable_pkey 主キー (id)
)
と (
  OID = 偽
)
テーブルスペース pg_default;
ALTER TABLE public.texttable
  所有者から王へ;

実行結果は図に示されています。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • PostgreSQL における varchar フィールド型の使用
  • テーブルフィールドを変更するためのPostgreSQLの一般的なコマンド操作
  • PostgreSQL と MySQL のデータ型の互換性の比較
  • Varchar 型フィールドを Int 型に変更するときに postgreSql がエラーを報告する問題を解決する
  • PostgreSQL のテキスト型フィールドの保存方法を変更する方法
  • PostgreSQL TIMESTAMP 型のタイムスタンプ操作

<<:  一般的な XHTML タグの使用方法の紹介

>>:  角度に基づくツリー型セカンダリテーブルを実現する

推薦する

MySQLクエリ文の実行プロセスを理解するための記事

序文要件を満たす特定のデータをデータベースから取得する必要があります。Select ABC FROM...

CSS3 での 2D および 3D 変換の実装

CSS3 は、要素の 2D 平面変換と視覚的な 3D 空間変換を実装します。2D 変換はより頻繁に使...

HTML でよく使われるタグの概要 (必読)

コンテンツ詳細タグ: <h1>~<h6>タイトルタグ<pre>テ...

Docker イメージの最適化 (1.16GB から 22.4MB)

目次最適化の第一歩: 軽量ベースイメージの使用第2段階の最適化:多段階構築Docker は、ソフトウ...

Mysql のデッドロックの表示とデッドロックの除去の詳細な説明

序文しばらく前にMysqlのデッドロック問題に遭遇したので、解決しました。問題の説明: Mysql ...

Docker で Tomcat を使用して Web アプリケーションを迅速にデプロイする方法の例

Docker の基本的な操作を学習した後、コンテナにいくつかの基本的なアプリケーションをデプロイして...

Docker での Redis の最も詳細なインストールと構成 (画像とテキスト付き)

1. Dockerに適したRedisのバージョンを見つけるdocker hubで見つけることができ...

ウェブデザインの概要

<br />1998年に最初の個人ページが誕生してから2008年の今日まで、デザイン業界...

React Nativeプロジェクトフレームワークの構築経験

React Native は、2015 年 4 月に Facebook によってオープンソース化され...

Linux でのルーティングと仮想マシン ネットワークの設定に関する詳細なグラフィック説明

ルーティングとは何ですか?ルーティングとは、相互接続されたネットワークを介して送信元ステーションから...

MySQL シリーズ 7 MySQL ストレージ エンジン

1. MyISAM ストレージエンジン欠点:トランザクションはサポートされていません最小粒度ロック:...

MySql のインデックス、ロック、トランザクションの知識ポイントのまとめ

この記事では、MySql のインデックス、ロック、トランザクションに関する知識のポイントをまとめてい...

Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集

/****************** * カーネルデバッグ技術 ****************...

MySQL の int、char、varchar のパフォーマンスを比較する

インターネットには、真実のように見える「噂」がたくさんあります。もちろん、悪意のあるものではありませ...

Docker ファイルの保存パス、コンテナの起動コマンド操作の取得

コンテナはすでに作成されていますが、その起動パラメータ(データがマウントされる場所)を知る方法 #コ...