2016-04-25 15 views
1
私のiOSで

とAndroidプロジェクトでの単一のルックアップと内容に基づいて、私は次のようになりますSQLiteのテーブルを持っています単語のカンマ区切りリスト。更新テキスト列はSQLiteの

リストの先頭に単語を追加して特定の行の単語リストを更新したいとします。リストには5つ以上の項目が含まれている必要がありますので、最後の単語も削除します。例えば

、私はcherryrow id 1を更新したならば、私は

cherry, apple, banana, orange, peach 

になるだろうか、私はrow id 2で同じ更新をしていたならば、私は

cherry, car, plane, orange 

私の質問になるだろう

私はaq行を取得し、テキストを処理して、行を更新します。ただし、これには2つのテーブルルックアップが必要です.1つはクエリ用で、もう1つは更新用です。これは単一の更新の参照で可能ですか?

replace() functionがありますが、ここでは何も置き換えていません。私はまた単にincrementing an integerではない。私はSQLite core functionsで何も明らかにしなかった。

答えて

3

正解

の単語列は単語のカンマ区切りリストを保持しているTEXT列です。

1NF。 カラムに原子データが含まれています。スキーマを正規化してコードを整理し、パフォーマンスを向上させます。

回避策ソリューション:

SQLiteが組み込まれていませんreverse機能、それは少し醜いですその理由は次のとおりです。

CREATE TABLE mytable(id INTEGER NOT NULL, words TEXT); 

INSERT INTO mytable(id,words) VALUES (1,'apple, banana, orange, peach, strawberry'); 
INSERT INTO mytable(id,words) VALUES (2,'car, plane, orange'); 
INSERT INTO mytable(id,words) VALUES (3,'sheep, car, plane, horse, cow'); 
INSERT INTO mytable(id,words) VALUES (4,'sheep, cherry, plane, horse, cow'); 

UPDATE mytable 
SET words = CASE 
      WHEN (LENGTH(words) - LENGTH(REPLACE(words, ',', ''))) < 4 
      THEN 'cherry, ' || words 
      ELSE SUBSTR('cherry, ' || words, 1, 
         LENGTH(words) + LENGTH('cherry, ') - 
         LENGTH(SUBSTR(SUBSTR(
         SUBSTR(SUBSTR(words, INSTR(words,',')+1), INSTR(SUBSTR(words, INSTR(words,',')+1), ',')+1), 
         INSTR(SUBSTR(SUBSTR(words, INSTR(words,',')+1), INSTR(SUBSTR(words, INSTR(words,',')+1), ',')+1), ',') + 1), 
         INSTR(SUBSTR(
         SUBSTR(SUBSTR(words, INSTR(words,',')+1), INSTR(SUBSTR(words, INSTR(words,',')+1), ',')+1), 
         INSTR(SUBSTR(SUBSTR(words, INSTR(words,',')+1), INSTR(SUBSTR(words, INSTR(words,',')+1), ',')+1), ',') + 1),',')+1)) -1 
        ) 
      END 
WHERE words NOT LIKE '%cherry%'; 

SELECT * FROM mytable; 

SqlFiddleDemo

それをより作るためにあなたは値をcherryに変更する必要があります。

出力:

どのように動作
╔════╦══════════════════════════════════════╗ 
║ id ║    words     ║ 
╠════╬══════════════════════════════════════╣ 
║ 1 ║ cherry, apple, banana, orange, peach ║ 
║ 2 ║ cherry, car, plane, orange   ║ 
║ 3 ║ cherry, sheep, car, plane, horse  ║ 
║ 4 ║ sheep, cherry, plane, horse, cow  ║ 
╚════╩══════════════════════════════════════╝ 

:区切り文字(カンマ)の数が4だけの値を連結よりも低い場合

  • UPDATE ... WHERE words NOT LIKE '%cherry%';が既にcherry
  • SET words = CASE WHEN (LENGTH(words) - LENGTH(REPLACE(words, ',', ''))) < 4を持つ行を更新しません文字列に
  • カンマの数が4の場合、これは5つの値を持つことを意味します。その後、比較のために、最後のコンマ

SQL Serverバージョンに1からSUBSTRINGを使用し、最初に目的の文字列を追加します。

DECLARE @val VARCHAR(100) = 'cherry'; 

UPDATE mytable 
SET words = CASE 
      WHEN LEN(words)-LEN(REPLACE(words, ',', '')) < 4 THEN @val + ', ' + words 
      ELSE LEFT(@val + ', ' + words, 
         LEN(@val + ', ' + words) - CHARINDEX(',', REVERSE(words))) 
      END 
WHERE words NOT LIKE '%'+ @val +'%'; 

SELECT * FROM mytable; 

LiveDemo

+1

はうわー、私は感心してい。私はスキーマを正規化する方法についてもっと学ぶ必要があります。 – Suragch