Powershell & ldquo; -gt & rdquo; сравнение возвращает неправильный результат [дубликат]

Мне нравится делать это, оценивая записи по некоторым столбцам. В этом случае значения ранга rev группируются по id. Те, у кого выше rev, будут иметь более низкий рейтинг. Таким образом, наивысший rev будет иметь ранжирование 1.

select id, rev, content
from
 (select
    @rowNum := if(@prevValue = id, @rowNum+1, 1) as row_num,
    id, rev, content,
    @prevValue := id
  from
   (select id, rev, content from YOURTABLE order by id asc, rev desc) TEMP,
   (select @rowNum := 1 from DUAL) X,
   (select @prevValue := -1 from DUAL) Y) TEMP
where row_num = 1;

Не уверен, что введение переменных делает все это медленнее. Но, по крайней мере, я не дважды запрашиваю YOURTABLE.

9
задан JPBlanc 30 June 2015 в 21:08
поделиться

3 ответа

Это потому, что вы сравниваете строку с целым числом. Этот порядок имеет значение.

"56" -lt 7

На самом деле это то же самое, что:

"56" -lt "7"

Альтернативно:

56 -lt "7"

даст вам правильный результат. PowerShell пытается принудить аргумент правой стороны к типу левой стороны.

Вы можете попробовать явное приведение:

[int]$Input -lt $GeneratedNum
14
ответ дан briantist 1 September 2018 в 05:40
поделиться

Используя switch:

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum

:lop Do{
    switch ((Read-Host 'Take a new guess!') -as [int])
    {
        {$_ -eq $null}{continue}
        {$_ -lt $GeneratedNum}{'Too Low';continue}
        {$_ -gt $GeneratedNum}{'Too High';continue}
        {$true}{'Good Job!';break lop}
    }

} while($true)
0
ответ дан cherimpe 1 September 2018 в 05:40
поделиться

Проблема связана с тем, что Read-Host возвращает строку, поэтому ваш литой $Input является ArrayListEnumeratorSimple try:

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum

$isQuitting = $false
Do{
    $Input = (Read-Host "Take a guess!") -as [int]

    If($Input -lt $GeneratedNum){Write-Output "Too Low"}
    If($Input -gt $GeneratedNum){Write-Output "Too High"}
    If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}

} Until($isQuitting -eq $true)

Вы также должны использовать try{}catch{}, чтобы поймать если вход не является int.

То, что вы должны понимать, заключается в том, что при использовании операторов сравнения PowerShell выбран тип левой части, так что эта часть должна быть введена в левый тип. Зная, что вы могли бы написать следующее, где я просто положил $GeneratedNum, который является целым числом слева от сравнений:

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum

$isQuitting = $false
Do{
    $Input = (Read-Host "Take a guess!")

    If($GeneratedNum -gt $Input){Write-Output "Too Low"}
    If($GeneratedNum -lt $Input){Write-Output "Too High"}
    If($GeneratedNum -eq $Input){Write-Output "Good Job!"; $isQuitting = $true}

} Until($isQuitting -eq $true)
4
ответ дан JPBlanc 1 September 2018 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: