【问题标题】:Is it possible to have a where with a select statement which you add wildcards to是否可以在 where 中添加通配符的 select 语句
【发布时间】:2015-08-05 07:51:39
【问题描述】:

我有一种情况,我需要在 where 中使用 select 语句,然后还要在它返回的值上附加和前置通配符。例如:

select * from [Customers.customervisibility] where userId like '%,' (Select Id from [Users.Users] where name ='MyName') ',%'

但运行它会给出:

',%' 附近的语法不正确。

现在Select 语句只会返回 1 个 id,所以我不知道是否有更好的方法来编写它可能使用函数。

总体目标是让我可以从[customer.customervisibility] 中选择id 包含在逗号分隔的字符串列[UserId] 中的行

例如如果id = 8

我需要获取*,8,*...所在的行

它必须是内联的,我不能使用变量,你将不得不原谅糟糕的数据库设计。这是为了它可以与第三方软件一起使用

【问题讨论】:

  • 您不需要连接字符串吗? where userId like '%,'+ (select....) + ',%'
  • 如果我这样做,我会得到:Conversion failed when converting the varchar value '%,' to data type int. 并且 UserId 列是 nvarchar(max)
  • 你用的是什么关系型数据库?
  • Microsoft Sql Server.. 实际上它的 Azure Sql,但相同的区别
  • USE convert(VARCHAR(100),userId) like '%'+(Select Id from [Users.Users] where name ='MyName')+'%'

标签: sql select where wildcard


【解决方案1】:

试试这个where 子句

如果您的 DBMS 支持Concat,请使用这个。

userId like concat('%' ,(Select top 1 cast(Id as varchar(50)) from [Users.Users] where name ='MyName') ,'%')

其他

userId like '%' +(Select top 1 cast(Id as varchar(50)) from [Users.Users] where name ='MyName') +'%'

如果您的子查询返回多行,我使用Top 1 来避免子查询返回多行错误

【讨论】:

    【解决方案2】:

    您似乎忘记了字符串的串联字符+。试试下面的查询:

    select * from [Customers.customervisibility] where userId like '%,'+(Select Id from [Users.Users] where name ='MyName')+',%'
    

    这将给出 userId 包含您的 ID 的结果,其中 userId 是逗号分隔的字符串。

    【讨论】:

      【解决方案3】:
      SELECT        *
      FROM            [Customers.customervisibility]
      WHERE        (userId LIKE '%  , Select Id from [Users.Users]  where status="MyName"     %')
      

      【讨论】:

      • 这给出了错误:Incorrect syntax near 'MyName'.
      【解决方案4】:

      试试这个:

      select * from [Customers.customervisibility] where convert(VARCHAR(100),userId) like '%'+(Select Id from [Users.Users] where name ='MyName')+'%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 2012-12-28
        • 2017-03-03
        相关资源
        最近更新 更多