Oracleにおける、改行コードを含むレコードを検索・取得する方法です。2パターンあります。
改行コードを含むレコードを検索・取得
Oracleにおいて、改行コードを含むレコードを検索・取得する場合、以下2パターンがあります。
- INSTR関数
- LIKE演算子
どちらでも可能です。
この後、サンプルクエリを実行するためのテストデータです。
CREATE TABLE CRLF_TEST_TABLE (
id NUMBER,
TEST_COL VARCHAR2(100)
);
--CR
INSERT INTO CRLF_TEST_TABLE VALUES (1, '1行目' || CHR(13) || '2行目');
--LF
INSERT INTO CRLF_TEST_TABLE VALUES (2, '1行目' || CHR(10) || '2行目');
--CRLF
INSERT INTO CRLF_TEST_TABLE VALUES (3, '1行目' || CHR(13) || CHR(10) || '2行目');
テストデータの状態。

Oracle APEXだと改行されてない様に見えてしまうので、CSVをダウンロードして中身を確認。

改行されてますね。
これを用いて、INSTRとLIKEで実行します。
INSTR関数で改行コードを含むレコードを検索・取得
INSTR関数を使用して改行コードを含むレコードを検索・取得する構文は以下。
--CR検索 SELECT * FROM テーブル名 WHERE INSTR(カラム名, CHR(13)) > 0; --LF検索 SELECT * FROM テーブル名 WHERE INSTR(カラム名, CHR(10)) > 0; --CRLF検索 SELECT * FROM テーブル名 WHERE INSTR(カラム名, CHR(13) || CHR(10)) > 0;
INSTR関数をWHERE句に設定すると、改行コードを含むレコードを検索することが出来ます。
- 第1引数:対象のカラム
- 第2引数:改行コード
INSTR関数の第2引数に改行コードを入れるだけです。
実行サンプル(INSTR関数)
INSTR関数を使用した場合の実行サンプルです。
--CR
SELECT 'CR' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE INSTR(TEST_COL, CHR(13)) > 0
UNION ALL
--LF
SELECT 'LF' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE INSTR(TEST_COL, CHR(10)) > 0
UNION ALL
--CRLF
SELECT 'CRLF' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE INSTR(TEST_COL, CHR(13) || CHR(10)) > 0;
結果はコチラ。

当たり前ですが、CR・LFを単独で条件に含めた場合でも、CRLFのレコードもヒットします。
例えば、「CLだけ」「LFだけ」を検索したい場合はWHERE句の条件を加えてあげる必要があります。「CRLF」のみはそのままで大丈夫です。
--CRだけ
SELECT 'CR' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE INSTR(TEST_COL, CHR(13)) > 0
AND INSTR(TEST_COL, CHR(10)) = 0
AND INSTR(TEST_COL, CHR(13) || CHR(10)) = 0
UNION ALL
--LFだけ
SELECT 'LF' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE INSTR(TEST_COL, CHR(10)) > 0
AND INSTR(TEST_COL, CHR(13)) = 0
AND INSTR(TEST_COL, CHR(13) || CHR(10)) = 0
UNION ALL
--CRLFだけ
SELECT 'CRLF' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE INSTR(TEST_COL, CHR(13) || CHR(10)) > 0;
これを再実行します。

これで「CLだけ」「LFだけ」を検索することが出来ました。
LIKE演算子で改行コードを含むレコードを検索・取得
LIKE演算子を使用して改行コードを含むレコードを検索・取得する構文は以下。
--CR検索 SELECT * FROM テーブル名 WHERE カラム名 LIKE '%' || CHR(13) || '%'; --LF検索 SELECT * FROM テーブル名 WHERE カラム名 LIKE '%' || CHR(10) || '%'; --CRLF検索 SELECT * FROM テーブル名 WHERE カラム名 LIKE '%' || CHR(13) || CHR(10) || '%';
LIKEの条件に改行コードを加えるだけです。
実行サンプル(LIKE演算子)
LIKE演算子を使用した場合のサンプルです。
--CRだけ
SELECT 'CR' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE TEST_COL LIKE '%' || CHR(13) || '%'
AND TEST_COL NOT LIKE '%' || CHR(10) || '%'
UNION ALL
--LFだけ
SELECT 'LF' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE TEST_COL LIKE '%' || CHR(10) || '%'
AND TEST_COL NOT LIKE '%' || CHR(13) || '%'
UNION ALL
--CRLFだけ
SELECT 'CRLF' AS 改行コード
,id
,TEST_COL
FROM CRLF_TEST_TABLE
WHERE TEST_COL LIKE '%' || CHR(13) || CHR(10) || '%';
これを実行してみます。

大丈夫そうですね。
参考リンク
INSTR
パターン一致条件
関連記事

【Oracle】改行コードの種類と使用方法(サンプルクエリ)
Oracleの改行コードの種類です。CHRを使用すれば、改行コードを使うことが出来ます。

【Oracle】不要な改行コードを置換・削除する
Oracleにおいて、特定カラムに不要な改行コードが含まれていた場合、置換・削除する方法です。

