使用Contains参数选择不使用null

时间:2018-03-16 02:18:02

标签: sql-server tsql

使用下面的select,如果传入空字符串,我会收到以下错误:Null或空的全文谓词 从数据库中获取行时,在我的DBAdapter中。如果我提供一个值,例如Well,那么当我应该在r。[Desc]列中时,我不会得到结果。如果我传入Well One,我会得到:在全文搜索条件中“一个”附近的语法错误'好一个'。

如果我通过One,我什么也得不到。

我在这里读过类似的问题,并没有看到传入的值可能无效的模式,列数据的开头,列数据中间的单词或任何顺序的多个单词列数据。我认为如果列包含传入的值或部分值,Contains将返回该行。

我做错了什么?

if @Drawing = ''
set @Drawing = null

if @ItemName = ''
set @ItemName = null

if @CF3 = ''
set @CF3 = null

if @Desc = ''
set @Desc = null

if @Design = ''
set @Design = null

if @MaxPSI = 0
set @MaxPSI = null
Select distinct
  ,r.[DRAWING]
  ,r.[DESC]
  ,r.[OP_PSI]
  ,r.[MAX_PSI]
  ,r.[MAX_TEMP]
  ,r.[Insulated]
  ,r.[DESIGN]
From Ref r

inner join Eng e on e.[DRAWING] = r.[DRAWING]

where r.SurveyNumber = @SurveyNumber
And (rtrim(@Drawing) is NUll or rtrim(r.DRAWING)  like rtrim(@Drawing) + '%')
And (rtrim(@Design)  is NUll or rtrim(r.DESIGN)  like rtrim(@Design) + '%')
And (rtrim(@MaxPSI)  is NUll or rtrim(r.MAX_PSI)  like rtrim(@MaxPSI) + '%')
And (rtrim(@CF3)  is NUll or rtrim(e.CF3)  like rtrim(@CF3) + '%')
And (rtrim(@ItemName)  is NUll or rtrim(e.ITEM_NAME)  like rtrim(@ItemName) + '%')
AND  ((@Desc = '""') OR CONTAINS( (r.[Desc]), @Desc))

2 个答案:

答案 0 :(得分:0)

我认为您可以尝试按如下方式检查空:

AND  ((@Desc = '""' OR @Desc = '') OR CONTAINS( (r.[Desc]), @Desc))

我怀疑空谓词可能会以''而不是""传递。

没有使用Contains,但是从文档[here][1]中的部分开始,您似乎需要在单词之间使用运算符,或者需要用双引号""包装表达式。所以你可以做的就是尝试传递这样的参数:

AND  ((@Desc = '""' OR @Desc = '') OR CONTAINS( (r.[Desc]), '"'+@Desc+'"'))

答案 1 :(得分:0)

可能的目的是什么

rtrim(@Drawing) is NUll

如果它为NULL,则rtrim没有意义。除了字符串的比较基本上是一个rtrim。