テーブルの特定の列の最初の文字を削除するにはどうすればよいですか?


160

SQLでは、テーブルの特定の列の値の最初の4文字をどのように削除できますか?列名はStudent Codeで、値の例はABCD123Stu1231です。すべてのレコードについて、テーブルから最初の4文字を削除したい

案内してください

回答:


257
SELECT RIGHT(MyColumn, LEN(MyColumn) - 4) AS MyTrimmedColumn

編集:説明すると、RIGHTは2つの引数を取ります-操作する文字列(または列)と返す文字数(文字列の「右側」から開始)。LENは列データの長さを返し、4を減算して、RIGHT関数が左端の4文字を「後ろ」に残すようにします。

これが理にかなっているといいのですが。

もう一度編集します-Andrewの応答を読んだところ、彼は正しく相互運用していた可能性があり、私は誤解しているかもしれません。これが事実である場合(そして、単に修正された結果を返すのではなく、テーブルを更新したい場合)、これを行うことができます:

UPDATE MyTable
SET MyColumn = RIGHT(MyColumn, LEN(MyColumn) - 4)

彼は正しい軌道に乗ってだが、彼のソリューションはなり続ける廃棄は4つの文字が言ったのではなく、文字列の先頭に4つの文字が。


9
これは、4文字未満の値では失敗します。あなたは4. <ための列の値を返すためにケースブロックを追加する必要があります
スコット・アイビー

2
おそらくそれを処理する最良の方法は次のとおりです:UPDATE MyTableSET MyColumn = RIGHT(MyColumn、LEN(MyColumn)-4)WHERE LEN(MyColumn)> 4 4文字未満。とは言っても、OPは特定の列の最初の4文字をトリミングする必要があることを示していました。詳細が提供されない限り、すべての行をトリミングする必要があると思います。
アーロンアルトン

1
@ spencer7593-ははは...真。安全なWHERE句をいつでも追加できます:WHERE NOT ISNUMERIC(LEFT(MyColumn、1))
Aaron Alton

これをNULL列で呼び出すのは安全ですか?この場合はどうなりますか?
Ian R. O'Brien

私の場合、列内の実際のコンテンツのサイズに関係なく最初のn文字を除外したかったので、COL_LENGTH('MyTable', 'MyColumn')代わりにを使用しましたLEN(MyColumn)が、これはそれ以外ではうまくいきました!
sfarbota

86
Stuff(someColumn, 1, 4, '')

これは、最初の1文字の位置から始めて、4文字を何もないものに置き換えます''


7
古い質問ですが、1つ以上の関数を使用したり、ランダムな大きな数を使用したりしないため、この解決策を好みます。
Edwin Stoteler 2013年

4
さらに:someColumnCTEからの副選択や何かのような複雑な場合、これを2回評価する必要はありません。
ジェフ

1
ちなみに、このソリューションは数値のトリミングにも非常に適しています。
スティーブンボール

1
あなたが言ったことを補強するために、ここに完成した結果があります。まず、選択を行い、必要な行を取得していることを確認してから、この更新でそれを正しく取得します。注/注意-正常に実行された後は、最初の4文字を無差別に切り捨てるため、再実行しないでください:update table set textField =(SELECT STUFF(CONVERT(VARCHAR(MAX)、textField)、1、4、 ''))ここで、activitytype = 'A'およびApplieddate> '2017-06-30'およびtextFieldは '%The County1%'とは異なり、textFieldは '%The County2%'とは異なり、 '%The County3%'とは異なります)およびactivityid in (12345、... idの範囲... 56789)
dcparham

33

LENを使用して2つの文字列関数を作成する理由 必要なのは、キャラクター5だけです...

...SUBSTRING (Code1, 5, 8000)...

1
これは将来の証拠ですか?MSSQLの将来のバージョンで8,000より大きい最大varcharサイズを使用する可能性はありますか?
開発者向けWeb

3
varchar(max)はすでに8000文字を超えています。len(column)を指定すると、永久に機能します
Gaspa79

2
または、2000000000を使用します。LEN関数を追加する理由。値を追加せず、末尾のスペースも無視します(必要な場合)
gbn

1
おかげで、これは一回限りのものとして私のためにうまくいきました。受け入れられた答えは、何らかの理由で追加の文字を切り刻むことでしたが、これは完璧に機能します。
user2366842 2019年

2
@ user2366842承認された回答を使用して追加の文字が切り捨てられた理由として考えられるのは、テキストの末尾にスペースがあった可能性があるためです。RTRIMとLTRIMを使用して、必要に応じてこれを補正できます。
Spazmoose


7

これがあなたがやろうとしていることの簡単なモックアップです:)

CREATE TABLE Codes
(
code1 varchar(10),
code2 varchar(10)
)

INSERT INTO Codes (CODE1, CODE2) vALUES ('ABCD1234','')


UPDATE Codes
SET code2 = SUBSTRING(Code1, 5, LEN(CODE1) -4)

したがって、トリミングするフィールドに対して最後のステートメントを使用します:)

SUBSTRING関数は、5番目の文字から始まり、CODE1から4(最初にスキップされた文字の数)を引いた長さの間、Code1をトリムします。


5

完全なもの

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'

3

SQLでもこれを行うことができます。

substring(StudentCode,4,len(StudentCode))

構文

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)

3

これを試して。100%働く

UPDATE Table_Name
SET RIGHT(column_name, LEN(column_name) - 1)

  


3

値の長さが4未満である可能性がある場合、上の答えは適切ではありません。

T-SQL内

ネガティブを受け入れないため、「適切な関数に渡された無効な長さパラメーター」が表示されます。CASEステートメントを使用します。

SELECT case when len(foo) >= 4 then RIGHT(foo, LEN(foo) - 4) else '' end AS myfoo from mytable;

Postgres内

負の値をRIGHTに渡すと、文字列全体ではなく最初の文字が切り捨てられるため、4未満の値を指定すると、エラーではなく驚くべき動作が発生します。RIGHT(MyColumn, -5)代わりに使用する方が理にかなっています。

「-5」の代わりにトップアンサーの「length-5」を使用したときに得られるものを比較する例:

create temp table foo (foo) as values ('123456789'),('12345678'),('1234567'),('123456'),('12345'),('1234'),('123'),('12'),('1'), ('');

select foo, right(foo, length(foo) - 5), right(foo, -5) from foo;

foo       len(foo) - 5  just -5   
--------- ------------  -------     
123456789 6789          6789 
12345678  678           678  
1234567   67            67   
123456    6             6    
12345                       
1234      234               
123       3                 
12                          
1                           

1
どのデータベースを使用していますか?質問にはtsqlタグがありますが、T-SQLでは負のパラメーターを使用できません。「正しい関数に無効な長さのパラメーターが渡されました」というエラーメッセージが表示されます。
パロタ

タグに気づかなかった。回答をT-SQLとPostgresのセクションに分割します。ありがとうございました。
ヌメノン


2

共有するとよいでしょう。DB2を使用する場合: INSERT(someColumn, 1, 4, '')

Stuff DB2ではサポートされていません


1

のような特殊文字が前に付いている最初の数文字を削除する必要がある場合#、これは適切な文字です。

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.