मेरे पास एकाधिक विकल्प, एकाधिक उत्तर प्रश्न सहित प्रश्नावली प्रतिक्रिया का डेटाबेस तालिका (ओरेकल 11 जी) है। विकल्प कॉलम में प्रत्येक मान का चयन किया जा सकता है, और उत्तर कॉलम में उनके द्वारा चुने गए अंकों के संख्यात्मक मूल्य होते हैं।एसक्यूएल रेगेक्स - किसी अन्य फ़ील्ड से सबस्ट्रिंग के साथ बदलें
ID_NO OPTIONS ANSWERS
1001 Apple Pie|Banana-Split|Cream Tea 1|2
1002 Apple Pie|Banana-Split|Cream Tea 2|3
1003 Apple Pie|Banana-Split|Cream Tea 1|2|3
मैं एक प्रश्न है कि एक एकल स्ट्रिंग के रूप में जवाब के लिए पाठ रूप से जवाब डिकोड होगा, की जरूरत है।
ID_NO ANSWERS ANSWER_DECODE
1001 1|2 Apple Pie|Banana-Split
1002 2|3 Banana-Split|Cream Tea
1003 1|2|3 Apple Pie|Banana-Split|Cream Tea
मैं नियमित अभिव्यक्ति के साथ प्रयोग किया मूल्यों की जगह और सबस्ट्रिंग प्राप्त करने के लिए, लेकिन मैं एक तरह से ठीक से दो विलय करने के लिए बाहर काम नहीं कर सकता।
WITH feedback AS (
SELECT 1001 id_no, 'Apple Pie|Banana-Split|Cream Tea' options, '1|2' answers FROM DUAL UNION
SELECT 1002 id_no, 'Apple Pie|Banana-Split|Cream Tea' options, '2|3' answers FROM DUAL UNION
SELECT 1003 id_no, 'Apple Pie|Banana-Split|Cream Tea' options, '1|2|3' answers FROM DUAL)
SELECT
id_no,
options,
REGEXP_SUBSTR(options||'|', '(.)+?\|', 1, 2) second_option,
answers,
REGEXP_REPLACE(answers, '(\d)+', ' \1 ') answer_numbers,
REGEXP_REPLACE(answers, '(\d)+', REGEXP_SUBSTR(options||'|', '(.)+?\|', 1, To_Number('2'))) "???"
FROM feedback
मैं SQL में उत्तर मैन्युअल रूप से परिभाषित या डीकोड नहीं करना चाहता; अलग-अलग प्रश्नों (और विकल्पों की अलग-अलग संख्या) के साथ कई सर्वेक्षण हैं, इसलिए मुझे उम्मीद है कि एक ऐसा समाधान है जो गतिशील रूप से उन सभी के लिए काम करेगा।
मैंने विकल्पों और उत्तरों को LEVEL द्वारा अलग पंक्तियों में विभाजित करने का प्रयास किया है, और उन कोडों में फिर से जुड़ें जहां कोड मेल खाते हैं, लेकिन यह वास्तविक डेटासेट के साथ बहुत धीमी गति से चलता है (प्रतिक्रियाओं की 600 पंक्तियों के साथ 5-विकल्प प्रश्न)।
WITH feedback AS (
SELECT 1001 id_no, 'Apple Pie|Banana-Split|Cream Tea' options, '1|2' answers FROM DUAL UNION
SELECT 1002 id_no, 'Apple Pie|Banana-Split|Cream Tea' options, '2|3' answers FROM DUAL UNION
SELECT 1003 id_no, 'Apple Pie|Banana-Split|Cream Tea' options, '1|2|3' answers FROM DUAL)
SELECT
answer_rows.id_no,
ListAgg(option_rows.answer) WITHIN GROUP(ORDER BY option_rows.lvl)
FROM
(SELECT DISTINCT
LEVEL lvl,
REGEXP_SUBSTR(options||'|', '(.)+?\|', 1, LEVEL) answer
FROM
(SELECT DISTINCT
options,
REGEXP_COUNT(options||'|', '(.)+?\|') num_choices
FROM
feedback)
CONNECT BY LEVEL <= num_choices
) option_rows
LEFT OUTER JOIN
(SELECT DISTINCT
id_no,
to_number(REGEXP_SUBSTR(answers, '(\d)+', 1, LEVEL)) answer
FROM
(SELECT DISTINCT
id_no,
answers,
To_Number(REGEXP_SUBSTR(answers, '(\d)+$')) max_answer
FROM
feedback)
WHERE
to_number(REGEXP_SUBSTR(answers, '(\d)+', 1, LEVEL)) IS NOT NULL
CONNECT BY LEVEL <= max_answer
) answer_rows
ON option_rows.lvl = answer_rows.answer
GROUP BY
answer_rows.id_no
ORDER BY
answer_rows.id_no
अगर वहाँ एक समाधान सिर्फ Regex का उपयोग करके नहीं है, वहाँ स्तर की तुलना में एक अधिक कुशल तरीका मूल्यों विभाजित करने के लिए है? या क्या कोई और दृष्टिकोण है जो काम करेगा?
प्रासंगिक: http://stackoverflow.com/questions/26407538/split-string-into-rows-oracle-sql – QuestionC
फ़ंक्शन क्यों नहीं। सरल होना चाहिए। –