You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于字符串判断创建新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

使用LOCATEINSTR函数,搭配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

POSITIONSTRPOS函数,结合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

火山引擎 最新活动