BigQuery自定义字段数据验证:不拆分判断值是否包含15
不拆分数据实现值包含验证
问题描述
需要对如下格式的数据执行验证:若Value列包含单独值15,则标记为Valid,否则标记为Invalid,且不能拆分原数据行。
输入数据:
Key | Value ----|----------- 1221|10,15,23,33 1123|10,11,12 1990|19,15 1000|null
预期输出:
Key | Value | Validation Result| ----|-----------|------------------| 1221|10,15,23,33| Valid| 1123|10,11,12 | Invalid| 1990|19,15 | Valid| 1000|null | Invalid| ------------------------------------
之前尝试用split函数会把数据拆分成多行,现寻求不拆分的实现方法。
解决方案
1. SQL 实现
直接通过字符串匹配判断15是否为独立值,无需拆分数据:
SELECT Key, Value, CASE -- 覆盖15在开头、中间、结尾、单独出现的所有情况,同时排除null WHEN Value IS NOT NULL AND (Value = '15' OR Value LIKE '15,%' OR Value LIKE '%,15,%' OR Value LIKE '%,15') THEN 'Valid' ELSE 'Invalid' END AS [Validation Result] FROM YourTableName;
解释:用LIKE匹配不同位置的15,同时单独判断Value等于15的情况,确保只匹配独立的15值,不会误判155、215这类包含15但不是单独值的情况。
2. Python Pandas 实现
利用字符串匹配或正则表达式直接验证,不拆分原数据:
import pandas as pd # 构造输入数据 data = { 'Key': [1221, 1123, 1990, 1000], 'Value': ['10,15,23,33', '10,11,12', '19,15', None] } df = pd.DataFrame(data) # 方法1:用字符串方法判断 df['Validation Result'] = df['Value'].apply( lambda x: 'Valid' if pd.notna(x) and ('15,' in x or x.endswith('15')) else 'Invalid' ) # 方法2:用正则匹配更严谨(避免误判包含15的其他值) # df['Validation Result'] = df['Value'].str.contains(r'\b15\b', na=False).map({True: 'Valid', False: 'Invalid'}) # 输出格式化结果 print(df.to_string(index=False))
解释:两种方法都直接在原字符串上操作,lambda方法通过判断15,是否存在或字符串以15结尾来验证;正则方法用\b(单词边界)确保匹配的是独立的15值,更严谨。
内容的提问来源于stack exchange,提问作者Sri Bharath
相关产品推荐
相关产品推荐

