我有一個字串,例如:
'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
uj5u.com熱心網友回復:
您需要的只是將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為。
uj5u.com熱心網友回復:
您不需要 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<>在這里擺弄
uj5u.com熱心網友回復:
引發錯誤的查詢 - 如果重寫為 - 有效:
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>
uj5u.com熱心網友回復:
您可以使用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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494096.html
