USE test_db2
CREATE TABLE test_table2
(
Subscn_Purch_Id BIGINT COMMENT 'from deserializer',
Price_Amt DECIMAL(38,18),
Purch_Line_Item_Id BIGINT,
Subscn_Purch_Status_Id BIGINT COMMENT 'from defdf',
Offer_Coupon_Id BIGINT, -- INTRO OFFER
Offer_Period_Hrs BIGINT,
discount_offer_id STRING -- DISCOUNT
)
PARTITIONED BY (
testcol bigint
)
ROW FORMAT SERDE
'eeee'
STORED AS INPUTFORMAT
'rrrr'
OUTPUTFORMAT
'tttt';
从上面的DDL中我需要获取列级别的详细信息。 即 列名 数据类型, 数据长度(如果有) 数据精度(如果有) 专栏评论(如果有的话)
我不需要上面示例中的注释详细信息,例如“-INTRO OFFER”和“-DISCOUNT”。
我尝试使用正则表达式
\s*(\w+)\s*(\w+)(?:\s*\,\s*)?(?:\((\d+)(?:,\s?(\d+))?\))?(?:\s*\,\s*)?(?:(?=(?:.*COMMENT\s*)\'(.*)\'(?:\,|\))))
此正则表达式在提取'?'时获取其中带有'COMEMNT'单词的详细信息,但不提取其他内容。在此正则表达式的末尾,它获取了我儿子不需要的详细信息。
如何实现这一目标。
附加regex101链接:
答案 0 :(得分:0)
通常,尝试使用正则表达式解析这些字符串通常不是一个好主意。话虽如此,您可以尝试使用支持regex
的更新的\G
模块:
(?:\G(?!\A)|\()
\s*
(?P<column_name>\w+)\s+
(?P<column_type>\w+)
(?:
\(
(?P<column_size>[^()]+)
\)
)?
[, ]+
.*
请参见a demo on regex101.com,并注意修饰符。
(
和)
的每个块答案 1 :(得分:0)
@Jan的正则表达式可能会为您提供所需的东西,但是可能有更清洁的方法来解决此问题。您可以尝试直接在DB2中查询信息模式表。
SELECT
COLNO,
SYSTEM_COLUMN_NAME,
DATA_TYPE,
COALESCE(PRECISION, LENGTH) AS length,
SMALLINT(SCALE) AS scale,
STORAGE
FROM QSYS2/SYSCOLUMNS
WHERE
SYSTEM_TABLE_SCHEMA = 'your_db' AND
SYSTEM_TABLE_NAME = 'test_table2';