我想通过匹配变量中存储的输入来实现匹配/大小写。预期的逻辑应该是这样的:
match x:
case y:
print(...)
case z:
print(...)
Run Code Online (Sandbox Code Playgroud)
事实证明这个方法行不通。
它会导致此错误:“仅在最后一个 case 语句中才允许不可反驳的模式”,
我相信会发生这种情况,因为不知何故,第一个 case 旁边的变量被分配给下一个匹配的变量的值:如果我去调试,通过在“case y”行中,y 的值更改为 x 中存储的值。
但是,如果一切都属于一个类,则不会发生这种情况,如下所示:
class Vars:
x = int(input())
y = int(input())
z = int(input())
match Vars.x:
case Vars.y:
print("something")
case Vars.z:
print("anything")
Run Code Online (Sandbox Code Playgroud)
这种方法不会导致任何错误。
这是为什么?我的意思是,是什么让类变量成为可反驳的模式?
我有一个(相当复杂)的SQL语句,我从很多不同的表中选择数据,并应付不良遗留的数据结构,我有几个基于其他列的值是获得它们的值自定义列的.我目前用CASE声明解决了这个问题:
SELECT
...,
CASE channel
WHEN 1 THEN channel_1
WHEN 2 THEN channel_2
...
ELSE 0
END AS ChannelValue,
CASE channelu
WHEN 1 THEN channelu_1
WHEN 2 THEN channelu_2
...
ELSE '0'
END AS ChannelWithUnit,
...
FROM
...
--rest of statement continues with multiple joins and where/and clauses...
Run Code Online (Sandbox Code Playgroud)
我得到的所有执行在MS SQL Server Management Studio中查询时,我所期望的结果,和列名被列为我在指定AS条款.但是,出于某种原因,我不允许在WHERE语句中使用条件值.如果我加
AND ChannelValue > Limit * p.Percentage / 100
Run Code Online (Sandbox Code Playgroud)
在查询结束时,我在该行上收到错误消息
消息207,级别16,状态1,行152
无效的列名称"ChannelValue"
为什么不允许这样做?我该怎么做呢?
我有那种代码:
case sth of
{a, 1} -> doA();
{a, 2} -> doA();
{a, 3} -> doB()
end.
Run Code Online (Sandbox Code Playgroud)
有没有办法不重复"doA()"部分?我认为它应该很容易,但我在谷歌找不到答案.
我想检索条件in WHERE子句中的数据.
这是我的表看起来像:
Name Location Age
----------------------
AAA Bhuj 24
BBB Mumbai 22
CCC Bhuj 18
DDD Bhuj 27
EEE Mumbai 26
Run Code Online (Sandbox Code Playgroud)
我的WHERE条款是:
if location = 'Bhuj' then Age>20 else if location = 'Mumbai' then Age>25
我正在尝试使用此代码来实现此目的:
SELECT * FROM testing
WHERE
CASE Location WHEN 'Bhuj' THEN Age>20
WHEN 'Mumbai' THEN Age>25
END;
Run Code Online (Sandbox Code Playgroud)
此代码适用于MySQL(请参阅此SQLFiddle),但不适用于SQL Server(请参阅此SQLFiddle)并给出以下错误:
'>'附近的语法不正确:SELECT*FROM测试WHERE case位置当'Bhuj'然后Age> 20当'Mumbai'然后Age> 25 end
有什么建议吗?
我有一些使用多个if语句(大约100)的T-SQL代码,如下所示.如果第一个IF语句条件的计算结果为TRUE,它仍会评估99个语句的其余部分.
IF(@check = 'abc') SET @var1 = @value
IF(@check = 'def') SET @var2 = @value
IF(@check = 'ghi') SET @var3 = @value
IF(@check = 'jkl') SET @var4 = @value
IF(@check = 'mno') SET @var5 = @value
…
…
Run Code Online (Sandbox Code Playgroud)
我想将它们转换为使用CASE表达式.例如
CASE @check
WHEN 'abc' THEN SET @var1 = @value
WHEN 'def' THEN SET @var2 = @value
WHEN 'ghi' THEN SET @var3 = @value
WHEN 'jkl' THEN SET @var4 = @value
WHEN 'mno' THEN SET @var5 = @value
…
…
END
Run Code Online (Sandbox Code Playgroud)
但是,我无法这样做,我得到一个SQL错误,说我不能在CASE表达式中使用SET. …
我有下表:
-----------------------------------
PK integer date
-----------------------------------
1 2 03/01/01
2 1 04/01/01
3 3 02/01/01
4 3 05/01/01
5 2 01/01/01
6 1 06/01/01
Run Code Online (Sandbox Code Playgroud)
我想要做的是按日期列进行排序,但是要使整数2的日期高于其他整数的顺序.我的输出就是这样的.
-----------------------------------
PK integer date
-----------------------------------
1 2 01/01/01
5 2 03/01/01
3 3 02/01/01
2 1 04/01/01
4 3 05/01/01
6 1 06/01/01
Run Code Online (Sandbox Code Playgroud)
目前,我完全不知道如何在MySQL中实现这一点,或者即使它可能.我还没有尝试任何东西,因为我不知道从哪里开始.
我应该说非2的整数顺序不是问题,所以下表同样好.
-----------------------------------
PK integer date
-----------------------------------
1 2 01/01/01
5 2 03/01/01
2 1 04/01/01
6 1 06/01/01
3 3 02/01/01
4 3 05/01/01
Run Code Online (Sandbox Code Playgroud) 有没有办法在执行此操作时获取所有类型的字符串案例:
select count(word) from table where word="abcd"
Run Code Online (Sandbox Code Playgroud)
实际上,当这样做时,它与此不一样:
select count(word) from table where word="ABCD"
Run Code Online (Sandbox Code Playgroud) 是否需要ELSE在CASE表达式中包含一个子句?
例如,如果我想拉动猫的动物名称而不是ELSE,我可以使用这个SELECT声明:
SELECT DISTINCT(CASE WHEN animal_type = 'cat' THEN animal_name END) AS cat_names
Run Code Online (Sandbox Code Playgroud)
我知道我可以放入animal_type = 'cat'我的WHERE条款然后
SELECT DISTINCT cat_names,
Run Code Online (Sandbox Code Playgroud)
但我想知道答案.
我想创建一个与(x - y == 0) ? return 0 : return 100MySQL 相同的语句.可能看起来像这样的东西:
SELECT id, [(integer_val - 10 == 0) ? 0 : 100] AS new_val FROM my_table
Run Code Online (Sandbox Code Playgroud)
我想将每行中的属性与某个数字进行比较,如果该数字与行中的数字之间的差值为0,我希望它给我0,否则,我希望它给我100.
例:
应用此查询my_table(10为'与'对比'):
id | integer_val
===================
1 10
2 10
3 3
4 9
Run Code Online (Sandbox Code Playgroud)
会回来这个:
id | new_val
===================
1 100
2 100
3 0
4 0
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
清单r:
r= [['Paris', 10], ['amsterdam', 5], ['London', 18], ['london', 15], ['Berlin', 2], ['Stockholm', 4], ['oslo', 14], ['helsinki', 16], ['Zurich', 17]]
Run Code Online (Sandbox Code Playgroud)
如果我做反向排序:
sorted(r, reverse=True)
[['oslo', 14], ['london', 15], ['helsinki', 16], ['amsterdam', 5], ['Zurich', 17], ['Stockholm', 4], ['Paris', 10], ['London', 18], ['Berlin', 2]]
Run Code Online (Sandbox Code Playgroud)
我想要的是从大写元素开始,而不是小写元素.
[ ['Zurich', 17], ['Stockholm', 4], ['Paris', 10], ['London', 18], ['Berlin', 2], ['oslo', 14], ['london', 15], ['helsinki', 16], ['amsterdam', 5]]
Run Code Online (Sandbox Code Playgroud)
Python3中是否有一种简单的方法可以按需要对列表进行排序?
case ×10
sql ×5
select ×3
sql-server ×3
hive ×2
mysql ×2
python ×2
t-sql ×2
class ×1
database ×1
erlang ×1
if-statement ×1
list ×1
match ×1
sorting ×1
sql-order-by ×1
string ×1
where ×1
where-clause ×1