如何基于字符串判断创建新BIT列?SELECT子句实现类Contains功能
可行!不同SQL数据库的实现方案
完全可以实现你要的需求,不用自定义伪函数,直接用各个数据库的内置字符串匹配函数结合条件判断就能返回1/0或布尔值。以下是几种主流数据库的具体写法:
SQL Server
可以用CHARINDEX(或PATINDEX)函数判断子串是否存在,搭配IIF(SQL Server 2012及以上支持)简化逻辑,或者用兼容更早版本的CASE语句:
SELECT doc.*, -- 返回1(存在)/0(不存在) IsSync = IIF(CHARINDEX('Sync', doc.Url) > 0, 1, 0), -- 或者返回BIT类型的布尔值(true/false) IsSync_Bool = CASE WHEN CHARINDEX('Sync', doc.Url) > 0 THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END FROM vw_Doc AS doc
如果需要不区分大小写的匹配,只需把字符串统一转成大写或小写:
IsSync = IIF(CHARINDEX('sync', LOWER(doc.Url)) > 0, 1, 0)
MySQL/MariaDB
使用LOCATE或INSTR函数,搭配IF函数快速返回结果:
SELECT doc.*, -- 返回1/0 IsSync = IF(LOCATE('Sync', doc.Url) > 0, 1, 0), -- 直接返回布尔值(MySQL会自动将表达式结果转为1/0,也可显式用BOOL类型) IsSync_Bool = (LOCATE('Sync', doc.Url) > 0) FROM vw_Doc AS doc
不区分大小写的写法:
IsSync = IF(LOCATE('sync', LOWER(doc.Url)) > 0, 1, 0)
PostgreSQL
用POSITION或STRPOS函数,结合CASE返回1/0,或者直接用布尔表达式:
SELECT doc.*, -- 返回1/0 CASE WHEN POSITION('Sync' IN doc.Url) > 0 THEN 1 ELSE 0 END AS IsSync, -- 返回布尔值(true/false) (POSITION('Sync' IN doc.Url) > 0) AS IsSync_Bool FROM vw_Doc AS doc
不区分大小写的匹配可以用LOWER函数:
CASE WHEN POSITION('sync' IN LOWER(doc.Url)) > 0 THEN 1 ELSE 0 END AS IsSync
内容的提问来源于stack exchange,提问作者Greggz




