正解
の単語列は単語のカンマ区切りリストを保持している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
はうわー、私は感心してい。私はスキーマを正規化する方法についてもっと学ぶ必要があります。 – Suragch