在我的表中,我有一个cert_attr
存储Certificate X.509 Attributes的字段(比如说) 。
这是 3 行的示例(每行对应一个字段):
"CN=User1, OU=Eng, O=Company Ltd, L=D4, S=Dublin, C=IE"
"CN=User2, OU=Eng, O=Company Ltd, L=D2, S=Dublin, C=IE"
"OU=Eng, O=Company Ltd"
我正在尝试使用SELECT
以下方式将字段的值拆分为单独的列:
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "CN=", -1), ", ", 1) as CN,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "OU=", -1), ", ", 1) as OU,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "O=", -1), ", ", 1) as O,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "L=", -1), ", ", 1) as L,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "ST=", -1), ", ", 1) as ST,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "C=", -1), ", ", 1) as C
FROM mytable
这可行,但是缺少某些属性的行存在问题。
因此,在字段字符串中缺少属性的情况下,我希望该列为空,但它会返回整个字符串。
前两行示例按预期工作,正确返回以下列:
| CN | OU | O | L | S. | C |
| ----- | --- | ----------- | -- | ------ | -- |
| User1 | Eng | Company Ltd | D4 | Dublin | IE |
| User2 | Eng | Company Ltd | D2 | Dublin | IE |
问题在于第 3 行示例,我希望在找不到子字符串模式时返回一个空字符串:
| CN | OU | O | L | S. | C |
| ---------- | --- | ----------- | ---------- | ---------- | ---------- |
| OU=Eng,... | Eng | Company Ltd | OU=Eng,... | OU=Eng,... | OU=Eng,... |
而是返回整个字符串。
问题:
SUBSTRING_INDEX()
当找不到子字符串时,有什么方法可以返回一个空字符串?或者也许还有其他功能(如正则表达式)或其他解决方法?
我的目标是通过将这些属性放在具有有效值的单独列中来将数据提取到 TSV 文件中:
mysql mytable < query.sql > cert_attributes.tsv
第一部分只是向您展示该程序有效
db<>在这里摆弄
完整的存储过程,包括生成 tsv 文件
结果 tsv 文件
您必须检查 INTO OUTFILE 文件夹,该文件夹必须与 my.ini/cnf 文件中的条目相对应