[英]convert string into rows with SQL
我有一個字符串,例如:
'one,two,three'
我想將它轉換成行並將其用於 SQL 中的 IN 子句:
one
two
three
我嘗試了類似的東西:
SELECT column_value
FROM XMLTable('"one","two","three"');
它工作正常,但在連接條件下它失敗了。
SELECT 1
FROM dual
WHERE 'one' IN (SELECT column_value
FROM XMLTable('"one","two","three"'));
它給了我錯誤:
ORA-00932: inconsistent datatypes: expected - got CHAR 00932. 00000 - "inconsistent datatypes: expected %s got %s"
任何人都可以幫助我嗎?
注意:我不想使用 PLSQL
您不需要 XML 來拆分字符串,並且可以使用簡單(快速)的字符串函數:
WITH data (value) AS (
SELECT 'one,two,three' FROM DUAL
),
bounds (value, spos, epos) AS (
SELECT value, 1, INSTR(value, ',', 1)
FROM data
UNION ALL
SELECT value, epos + 1, INSTR(value, ',', epos + 1)
FROM bounds
WHERE epos > 0
)
SEARCH DEPTH FIRST BY value SET order_id
SELECT CASE epos
WHEN 0
THEN SUBSTR(value, spos)
ELSE SUBSTR(value, spos, epos-spos)
END as item
FROM bounds;
哪個輸出:
物品 一 二 三
在您的情況下,您有一個 XY 問題,您不需要拆分字符串,因為您可以使用LIKE
將搜索字符串與列表的子字符串進行匹配:
SELECT 1
FROM dual
WHERE ',' || :your_list || ',' LIKE '%,' || :search_value || ',%';
或使用硬編碼字符串:
SELECT 1
FROM dual
WHERE ',' || 'one,two,three' || ',' LIKE '%,' || 'one' || ',%';
db<> 在這里擺弄
引發錯誤的查詢 - 如果重寫為 - 有效:
SQL> select 1
2 from dual
3 where 'one' in (select regexp_substr('one,two,three', '[^,]+', 1, level)
4 from dual
5 connect by level <= regexp_count('one,two,three', ',') + 1
6 );
1
----------
1
SQL>
子查詢(使用regexp_substr
)將逗號分隔的值列表( 'one,two,three'
)拆分為行。
或者,如果您使用 Oracle Apex(或將其安裝在您的數據庫中),您可以使用apex_string.split
來簡化它:
SQL> select 1
2 from dual
3 where 'one' in (select * from apex_string.split('one,two,three', ','));
1
----------
1
SQL>
您需要的只是將CLOB
值轉換為[VAR]CHAR[2]
數據類型,例如
SELECT 1
FROM dual
WHERE 'one' IN (SELECT CAST(column_value AS VARCHAR2(20))
FROM XMLTable('"one","two","three"'))
1
---
1
為了使其與文字(例如'one'
)具有可比性。
此外, CAST
也可以用XMLCast
。
您可以使用REGEXP_COUNT
在列表中查找您的單詞。
這將比轉換更快
但是閱讀這個規范線程在數據庫列中存儲分隔列表真的那么糟糕嗎?
SELECT CASE WHEN REGEXP_COUNT('one,two,three', '^([^,]+,)*one(,[^,]+)*$', 1, 'i') > 0 THEN 1 ELSE 0 END as cnt FROM DUAL;
| 碳納米管 | | --: | | 1 |
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.