0

地名の表があります。前に追加の文字がある場合もあります。たとえば、都市名が Astana の場合はs.Astana. アスタナという場所の名前だけを取得する必要があります。を使いたいのですsubstrが、最初の大文字のインデックスが見つかりません。キリル文字が使われているのも問題です。いくつか例を挙げたい:

  1. Акмолинская область -> Акмолинская
  2. Кокшетау Г.А。-> Кокшетау
  3. г.Кокшетау -> Кокшетау
  4. Красноярский с.о. -> Красноярский
  5. с.Красный Яр -> Красный Яр

私が試したこと:フィールド short_nameru を作成し、このように更新しました

UPDATE center_kato ck SET ck.short_nameru = case when 
  LENGTH(SUBSTRING_INDEX(ck.nameru , ' ', -1)) > LENGTH(SUBSTRING_INDEX(ck.nameru , ' ',1))
  then SUBSTRING_INDEX(ck.nameru , ' ', -1)
  else SUBSTRING_INDEX(ck.nameru , ' ',1) 
  END

その後、私は再びそれを更新しました

UPDATE center_kato ck SET ck.short_nameru = case 
  when LENGTH(SUBSTRING_INDEX(ck.short_nameru , '.', -1)) > LENGTH(SUBSTRING_INDEX(ck.short_nameru , '.',1))
  then SUBSTRING_INDEX(ck.short_nameru , '.', -1)
  WHEN LENGTH(SUBSTRING_INDEX(ck.short_nameru , '.', -1)) < LENGTH(SUBSTRING_INDEX(ck.short_nameru , '.',1)) 
  then SUBSTRING_INDEX(ck.short_nameru , '.',1)
  ELSE ck.short_nameru 
  END

しかし、必要な値をいくつか失いました。"зимовка Туяк"なりまし"зимовка"たが、私は必要でした"Туяк"

4

3 に答える 3

2

SUBSTRING_INDEX関数を使用できます。

SELECT
  SUBSTRING_INDEX(city, '.', -1) as Place
FROM
  yourtable

負の値 (-1) は、文字列の末尾から逆検索を実行し、末尾 (一番右) の部分を返します。

編集

上記のサンプルデータを考えると、このクエリは必要なものを返すはずだと思います:

SELECT
  yourtable.id,
  SUBSTRING_INDEX(SUBSTRING(city, first_upper), ' ', 1) city_name
FROM
  yourtable INNER JOIN (
    SELECT
      id,
      MIN(CASE WHEN (MID(yourtable.city, numbers.n, 1) != '\.') AND
                    (UPPER(MID(yourtable.city, numbers.n, 1))=BINARY
                    MID(yourtable.city, numbers.n, 1))
               THEN numbers.n END) first_upper
    FROM
      numbers, yourtable
    GROUP BY
      id) f
  ON yourtable.id = f.id;

この fiddleをご覧ください。

for ループをシミュレートするには、1 から文字列の最大長までの数値を含む数値テーブルが必要です。私のサブクエリでは、都市ごとに、 を含まない文字列内の最小位置と、.その位置に含まれる文字が大文字の文字と等しい場所を計算しています (ここではバイナリ比較が必要です)。条件が true の場合、文字が既に大文字であることを意味します (または、特殊文字であることを意味しますが、; ! ?それらを除外する必要があります)。

次に、最初のスペース文字まで、計算された位置から部分文字列を抽出しています。

于 2013-07-25T10:48:16.547 に答える
1

SQLFiddel のデモは次
のとおりです。以下はアプローチです。

SELECT substring_index(col1, 
                       '.', 
                       -1) as Place
FROM temp
WHERE col1 LIKE '%\.%'
于 2013-07-25T10:54:55.080 に答える