簡體   English   中英

使用 SQL 將字符串轉換為行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM