“%”、“.”和“.-1、%”和“、%”或“%”在SQL/Oracle中是什么意思?

“%”、“.”和“.-1、%”和“、%”或“%”在SQL/Oracle中是什么意思?,sql,oracle,powerschool,Sql,Oracle,Powerschool,我具体指的代码是: AND ( (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' || CASE WHEN log.subtype is null THEN ' ' ELSE log.subtype END || ',%') OR (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtype

我具体指的代码是:

AND (
(','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' || 
    CASE WHEN log.subtype is null 
    THEN ' ' 
    ELSE log.subtype 
    END || ',%')
OR (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.-1,%')
OR (to_char(log.logtypeid) LIKE 
    CASE 
    WHEN to_char('~[gpv:lt]') = '-1' 
    THEN '%' 
    ELSE ','||to_char('~[gpv:lt]')||',' 
    END)  
)
任何澄清都很好。谢谢大家!

%被称为一个。更多信息。

那些-1%是字符串文字,用于基于几个contant和某些列的值构建类似条件。该语句显示了对如何在Oracle中使用字符串文本的基本误解

以这种情况为例:

','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.-1,%'
to_字符“~[gpv:lt]”完全没有用处,因为它只是将字符串常量“~[gpv:lt]”转换为。。。一串。因此,该部分可以简化为:

',~[gpv:lt],' LIKE '%,' || to_char(log.logtypeid) || '.-1,%'
基本上说:

将字符串常量“,~[gpv:lt],”与下列连接的结果进行比较

常量“%”,' 已转换为varchar的log.logtypeid列的值 常数'.-1,%' 因此,假设log.logtypeid包含值42,则生成条件

',~[gpv:lt],' LIKE '%,42.-1,%'
这只能在log.logtypeid列包含类似~[gpv:lt]的值时匹配。这会有点混乱,因为名为id的列通常不包含这样的结构化数据

如果我不得不猜测的话,我会说数据模型是高度非规范化的,这些列存储逗号分隔的结构化数据,甚至可能是结构化的键/值对


其他条件也有类似的作用

让我们从这个表达式开始:

(','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' || 
    CASE WHEN log.subtype is null 
    THEN ' ' 
    ELSE log.subtype 
    END || ',%')
这就是这个成语的一个例子:

','||a||',' LIKE '%,'||b||',%'
其中a是lt参数,b是类型点子类型字符串。只要有一个a字符串是逗号分隔的值列表,一个b字符串是单个值,并且希望知道列表a是否包含值b,就可以使用此比较

要了解为什么会这样写,首先看一下这一尝试,以更简单地完成:

a LIKE '%'||b||'%'
我们取b,前后各放一个通配符,然后匹配a。例如,如果a为1,2,3,b为2,则为真。不幸的是,如果a是12,34,56,b是2,这也是真的。LIKE不做逗号分隔的列表解析,只做字符串匹配

因此,接下来您可以尝试以下方法:

a LIKE '%,'||b||',%'
现在,如果b是2,模式是%,2,%-它将匹配任何包含,2的字符串,因此a=1,2,3为真,a=12,34,56为假。不幸的是,对于a=2,3,4也是false,因为2前面没有逗号;对于a=0,1,2也是false,因为2后面没有逗号

对于下一个改进,有两条路要走。您可以在a的开头、中间和结尾使用单独的模式大小写来匹配b。如果您这样做,使用正则表达式将有助于使其可读

另一种方法是修改模式以匹配现有模式。我们没有匹配0,1,2或2,3,4,因为列表的第一个元素和最后一个元素没有被逗号包围。但是如果我们在匹配前将逗号添加到列表的开头,那么列表的第一个元素将被逗号包围!并在a的末尾添加另一个逗号,以确保最后一个元素也被逗号包围

','||a||',' LIKE '%,'||b||',%'
现在,当a为0,1,2且b为2时,类似表达式变为:

',0,1,2,' LIKE '%,2,%'

这是一场比赛!找到第一个通配符0,1和2。最后一个通配符与末尾的零长度子字符串相匹配,这是允许的。

%是SQL通配符,类似于dir或ls命令的*号。下选,不显示任何结果。谷歌搜索“sql百分百登录”……我希望我能投你一票,因为你不能理解英语。我知道%是一个通配符。我不知道的是逗号、句点的用法,以及它们与%一起使用的时间。对于那些不知道的人,~[gpv:lt]内容来自PowerSchool标记语言。它从URL或POST数据中插入lt参数的值。这是我在stackexchange上看到的第一个powerschool问题。。。我加了一个标签。比我快5分钟。。。不管怎样,我把我的贴出来了,这也是一个很好的解释。唯一仍然没有意义的是,示例中的a是一个复杂/模糊的常量:to_char“~[gpv:lt]”,并且不是从a派生的column@a_horse_with_no_name正如我在对这个问题的评论中提到的,~[gpv:lt]东西是一个powerschool标签。它将扩展HTTP POST或GET中发送的lt参数的值。您在这里看到的内容基本上相当于PHP页面的一个片段,其中包含一个SQL查询,其中包含$u POST[lt]。除了powerschool标记语言比PHP可怕得多之外。注意:我不是PHP迷!那么你是说你希望我们看到的SQL查询是预处理的,问题中的SQL不是发送到数据库的真正SQL,因为~[gpv:lt]在SQL执行之前被替换了?是的,这个问题的海报可以通过提到更多的上下文使它更清楚。。。看看他之前的问题,显然与同一个问题有关,这是一个持续的问题。他似乎不知道powerschool的东西从哪里结束,oracle的东西从哪里开始。但是
在我的回答中,我试图忽略这一点,而将注意力集中在所有百分比和commasYeah的原因上,考虑到~[gpv:lt]在~[tlist_sql;,我假设其中的所有内容都是oracle查询的一部分。我以前没有学习过sql/oracle或HTML/CSS/Javascript,因此我对缺乏上下文的原因缺乏充分的理解,因此我对此表示歉意。我感谢你们两位花时间解释。我将尝试剖析你们两位编写的所有内容。