0

保存された情報の2つのバージョンを含むテーブルを使用しています。簡単にするために、1つの列には実行されたファイルの古い説明が含まれ、別の列には実行されたファイルを表示するための更新された標準が含まれます。古い列がそれ自体の中に複数の標準を持つことができるという点で、より複雑になります。テーブル:

Old Column              New Column
Desc: LGX/101/rpt          null
  null                     Home
Print: LGX/234/rpt         null
  null                     Print
  null                     Page

2つの列を1つに結合する必要がありますが、古い列の値の先頭から「Print:」および「Desc:」文字列も削除する必要があります。助言がありますか?あなたが知る必要がある何かを私が忘れているかどうか/いつ私に知らせてください!

(私はキャッシュSQLで書いていますが、私の問題に対する一般的なアプローチが欲しいのですが、それ以降の詳細を理解することができます。)

編集:条件は、substr(oldcol、1,5)='desc:' then substr(oldcol、6)else if substr(oldcol、1,6)='print:' then substr(oldcol、7)etc 。「desc:」と「print:」を取り出して、データをある程度サニタイズします。

EDIT2:テーブルを次のように見せたい:

    Col
  LGX/101/rpt
    Home
  LGX/234/rpt
    Print
    Page
4

3 に答える 3

2

あなたが探しているものを正確に理解することは困難です。上記は、結合/マージが必要な前/後、または両方の列を表していますか?

私の推測では、それCOALESCEはあなたを助けることができるかもしれません。一連のパラメーターを受け取り、最初の非NULLを返します。

于 2012-09-28T20:06:38.343 に答える
1

oldがNULLの場合はnewから、newがnullの場合はoldから値を取得したいようです。これを行うには、SQLでcaseステートメントを使用できます。CASEステートメントがMySQLでサポートされていることは知っていますが、ここで役立つかどうかはわかりません。

SELECT (CASE WHEN old_col IS NULL THEN new_col ELSE old_col END) as val FROM table_name

old_colがNULLの場合、これはnew_colを取得します。それ以外の場合は、old_colを取得します。

于 2012-09-28T20:09:58.217 に答える
0

CharIndex関数とSubstring関数の組み合わせを使用して、Print:およびDesc:を削除できます。ここに行きます

SELECT  CASE WHEN CHARINDEX(':',COALESCE(OldCol,NewCol)) > 0 THEN 
         SUBSTRING(COALESCE(OldCol,NewCol),CHARINDEX(':',COALESCE(OldCol,NewCol))+1,8000) 
         ELSE
         COALESCE(OldCol,NewCol)
        END AS Newcolvalue  
FROM  [SchemaName].[TableName]

Charindexは、検索している文字/文字列の位置を示します。

したがって、計算列(合体部分)の「:」の位置を取得し、その値を部分文字列関数に渡します。次に、「:」の後の部分を取得するための部分文字列関数を示す位置に+1を追加します。これで、「Desc:」と「Print:」のない文字列ができました。

お役に立てれば。

于 2012-09-28T21:52:56.880 に答える