0

varcharセルから数値を抽出し、それらを使用して計算を行い、結果でセルを更新することは可能ですか?

すなわち

  • 列のセルの値は「24a10b」です。

  • 24、10を取り、bに注意してください

  • 24 * 10=240を実行します

  • abがあった場合は1を引く

  • そのフィールドに239を格納します(「24a10b」を「239」に変更します)

  • テーブル内のすべての行でこれを行います

4

3 に答える 3

1

これはあなたの例で機能します:

SELECT
  (col * SUBSTRING_INDEX(col, 'a', -1)) - (RIGHT(col, 1)='B')
FROM
  op

こちらのフィドルをご覧ください。

  • colあなたの価値です'24a10 b'
  • SUBSTRING_INDEX(col, 'a', -1)'a'の右側にある文字列の部分を返します。'10 b'
  • '24a10 b' * '10 b'文字列を整数に自動的にキャストするの乗算24*10
  • RIGHT(col,1)='B'colがabで終わる場合はtrue(= 1)、それ以外の場合はfalse(0)
于 2013-02-26T22:37:24.910 に答える
1

それは確かに実行できますが、SQLはアトミック値の公理(つまり、第一正規形)を中心に設計されています。フィールドを分割する必要はほとんどありません。適切に設計されたデータベースで使用する必要があるのは、日付フィールドの月または年だけで作業したい日付を使用する場合のみです。確かに、このコアコンセプトに違反する、一部の馬鹿が設計したデータベースを見つけることはできますが、これらの設計をどのように処理するかを理解することから始めるのは悪い考えです。

さらに、「そのセル239に格納する」の最後のステップでは、データベースをスプレッドシートのように表示しているように思われます。彼らはそうではありません。データベースのもう1つのコアコンポーネントは、行の順序は重要ではないということです。一方、フィールドは常に同じ行の他のフィールドに関連しています。フィールドの1つの値を、そのレコードのIDフィールドが239であるものに設定することもできますが、通常、レコードが239番目であるという事実を気にすることはありません。

そうは言っても、これがあなたが望むことをするクエリです:

仮定:フィールドの形式は「11a22b」です。つまり、2桁の数字、文字、さらに2桁の数字、場合によってはスペースと文字「b」が続きます。

SELECT CAST(SUBSTRING(Value,1,2) AS INT) 
    * CAST(SUBSTRING(Value,3,2) AS INT) 
    + CASE RIGHT(Value,1) WHEN 'b' THEN -1 ELSE 0 END
FROM MyTable
于 2013-02-26T22:44:01.260 に答える
0

誰かが似たようなものを探している場合、完全な答えは次のようになります。

UPDATE `table`
SET cell = (
CAST( SUBSTRING( cell, 1, 2 ) AS UNSIGNED )
*
CAST( SUBSTRING( cell, 4, 2 ) AS UNSIGNED ) 
-
(SUBSTRING( latitud, 7, 1 ) = 'b')  
)
WHERE 1;   
于 2013-02-26T22:36:25.083 に答える