यदि आपको मध्यस्थ कदम की आवश्यकता है:
SELECT unnest(string_to_array(a, ' '))::float8
-- or do something else with the derived table
FROM unnest(string_to_array('3.584731 60.739211,3.590472 60.738030', ',')) a;
यह regexp_split_to_table()
, लेकिन फिर भी तेज़ हो सकता है क्योंकि रेगुलर एक्सप्रेशन आमतौर पर अधिक महंगे होते हैं। (EXPLAIN ANALYZE
के साथ परीक्षण करें ।)
मैं पहले ','
. पर विभाजित हुआ , और उसके बाद ' '
. पर - आप जो वर्णन करते हैं उसका उल्टा क्रम अधिक पर्याप्त लगता है।
यदि आवश्यक हो, तो आप इसे PL/pgSQL फ़ंक्शन में लपेट सकते हैं:
CREATE OR REPLACE FUNCTION public.split_string(_str text
, _delim1 text = ','
, _delim2 text = ' ')
RETURNS SETOF float8 AS
$func$
BEGIN
RETURN QUERY
SELECT unnest(string_to_array(a, _delim2))::float8
-- or do something else with the derived table from step 1
FROM unnest(string_to_array(_str, _delim1)) a;
END
$func$ LANGUAGE plpgsql IMMUTABLE;
या सिर्फ एक SQL फ़ंक्शन:
CREATE OR REPLACE FUNCTION public.split_string(_str text
, _delim1 text = ','
, _delim2 text = ' ')
RETURNS SETOF float8 AS
$func$
SELECT unnest(string_to_array(a, _delim2))::float8
FROM unnest(string_to_array(_str, _delim1)) a
$func$ LANGUAGE sql IMMUTABLE;
इसे IMMUTABLE
बनाएं प्रदर्शन अनुकूलन और अन्य उपयोगों की अनुमति देने के लिए।
कॉल करें (_delim1
. के लिए दिए गए डिफ़ॉल्ट का उपयोग करके और _delim2
):
SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030');
या:
SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030', ',', ' ');
सबसे तेज़
शीर्ष प्रदर्शन के लिए, translate()
साथ में unnest(string_to_array(...))
:
SELECT unnest(
string_to_array(
translate('3.584731 60.739211,3.590472 60.738030', ' ', ',')
, ','
)
)::float8