sql - كيفية - استبدال القيمة في حقل فارغ بعد استخدام split_part




كيفية انشاء جدول في sql (2)

استخدام مزيج من كواليس () و نوليف ()، على سبيل المثال:

with my_table(version) as (
values
    ('10'), ('10-1'), ('10-2')
)

select 
    version, 
    split_part(version, '-', 1)::int as major, 
    coalesce(nullif(split_part(version, '-', 2), ''), '0')::int as minor
from my_table

 version | major | minor 
---------+-------+-------
 10      |    10 |     0
 10-1    |    10 |     1
 10-2    |    10 |     2
(3 rows)    

لدي عمودين، id integer version text . أحاول تحويل السلاسل في version إلى أعداد صحيحة حتى أختار الحد الأقصى (الأحدث) نسخة من المعرف.

ومع ذلك، فإن الحالة الأولى من id مخازن نفسها version . مثال:

id | version
---+--------
10 | '10'

في مقابل:

id | version
---+--------
10 | '10-0'

صفوف إضافية تتبع معرف الاتفاقية: 10، الإصدار: 10-1. إلخ.

كيف يمكنني تحقيق ذلك؟ لقد حاولت split_part() وألقي كما int . ومع ذلك، split_part(version, "-", 2) ما يبدو وكأنه سلسلة فارغة. لقد حاولت تشغيل هذا باستخدام COALESCE(splitpart..., '0') دون جدوى لأنها حاولت قراءة الحقل الفارغ عاد من قبل مؤشر الحقل 2.


للالتفاف حول سلاسل الإصدار التي ليس لها واصلة، يمكنك استخدام تعبير CASE :

CASE WHEN version LIKE '%-%'
     THEN SPLIT_PART(version, '-', 2)::int
     ELSE 0 END

الفكرة الأساسية هي استخدام رقم الإصدار، يلقي إلى إنت، عندما الواصلة موجودة، ولكن خلاف ذلك لنفترض أن الإصدار هو صفر إذا كانت الواصلة غائبة.

مع هذه العقبة خارج الطريق، الاستعلام الخاص بك الآن يقتصر فقط على استعلام ROW_NUMBER() . هنا، القسم هو id ، ويعطى الترتيب باستخدام التعبير CASE أعلاه للإصدار.

SELECT
    t.id, t.version
FROM
(
    SELECT
        id,
        CASE WHEN version LIKE '%-%'
             THEN version
             ELSE version || '-0' END AS version,
        ROW_NUMBER() OVER (PARTITION BY id
                           ORDER BY
                               CASE WHEN version LIKE '%-%'
                                    THEN SPLIT_PART(version, '-', 2)::int
                                    ELSE 0 END DESC) rn
    FROM yourTable
) t
WHERE t.rn = 1
ORDER BY t.id;

عرض هنا:

Rextester





natural-sort